如何在 SwiftUI 中呈现全屏 AVPlayerViewController

Posted

技术标签:

【中文标题】如何在 SwiftUI 中呈现全屏 AVPlayerViewController【英文标题】:How to present a full screen AVPlayerViewController in SwiftUI 【发布时间】:2020-04-20 14:03:24 【问题描述】:

在 SwiftUI 中,设置 AVPlayerViewController 的最佳方式似乎是以类似这样的方式使用 UIViewControllerRepresentable...

struct PlayerViewController: UIViewControllerRepresentable 
    var videoURL: URL?


    private var player: AVPlayer 
        return AVPlayer(url: videoURL!)
    


    func makeUIViewController(context: Context) -> AVPlayerViewController 
        let controller =  AVPlayerViewController()
        controller.modalPresentationStyle = .fullScreen
        controller.player = player
        controller.player?.play()
        return controller
    

    func updateUIViewController(_ playerController: AVPlayerViewController, context: Context) 

    

但是,从文档中可以看出,以全屏方式显示此控制器的唯一方法是使用工作表显示它。

.sheet(isPresented: $showingDetail) 
    PlayerViewController(videoURL: URL(string: "..."))
      .edgesIgnoringSafeArea(.all)

这不会给你一个带关闭按钮的全屏视频,而是一个可以滑动的表单模式。

在标准的非 SwiftUI Swift 中,最好的方法似乎是呈现这个控制器......

let controller = PlayerViewController(videoURL: URL(string: "..."))
self.present(controller, animated: true)

...但是 SwiftUI 没有 self.present 作为其中的一部分。在 SwiftUI 中呈现全屏视频的最佳方式是什么?

【问题讨论】:

这个答案可以帮助你,你可以随意改变风格和演示模式。 ***.com/questions/60391281/… Apple 在 SwiftUI 中添加了对全屏视图的支持。它适用于我使用 UIImagePickerView,因此它也可能适用于您的 AVPlayerView/Controller。在这里查看我的答案:***.com/a/64069283/3997690 developer.apple.com/forums/thread/131762 【参考方案1】:

我会使用带有 ZStack 的解决方案而不是工作表(如果需要,可能使用自定义转换),如下所示

ZStack 
    // ... other your content below

    if showingDetail  // covers full screen above all
       PlayerViewController(videoURL: URL(string: "..."))
         .edgesIgnoringSafeArea(.all)
         //.transition(AnyTransition.move(edge: .bottom).animation(.default)) // if needed
    

【讨论】:

谢谢!很有道理,希望在文档中更清楚!

以上是关于如何在 SwiftUI 中呈现全屏 AVPlayerViewController的主要内容,如果未能解决你的问题,请参考以下文章

呈现 Modal 全屏 SwiftUI

SwiftUI 全屏 UIImagePickerController(相机)

SwiftUI - tvOS 上的 AVPlayerViewController 全屏

在 SwiftUI 中,如何将视频循环添加为全屏背景图像?

如何使用 SwiftUI 将详细视图扩展到全屏?

如何让 SwiftUI 循环中的元素全屏显示?与 Apple 一样,今日应用