在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)
}
这并不是给你一个全屏视频的解雇按钮,而是给你一个可以滑动的 sheet modal。
在标准的非SwiftUI Swift中,似乎最好的方法是用这个控制器来呈现......但SwiftUI并没有这样做。
let controller = PlayerViewController(videoURL: URL(string: "..."))
self.present(controller, animated: true)
...但SwiftUI并没有一个真正意义上的 self.present
作为其中的一部分。在SwiftUI中呈现全屏视频的最佳方式是什么?
我将使用ZStack的解决方案来代替sheet(如果需要的话,可能会有自定义的过渡),就像下面这样。
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
}
}