如何在 SwiftUI 中呈现全屏 AVPlayerViewController

How to present a full screen AVPlayerViewController in SwiftUI

在 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。

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

这不会为您提供带有关闭按钮的全屏视频,而是一个 sheet 模式,可以将其滑开。

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

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

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

而不是 sheet 我会使用 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
    }
}