我创建了一个AVPlayerViewController的UIViewRepresentable版本,以使用SwiftUI,提供的URL和可选的启用/禁用控件来播放电影。这是代码:
struct PlayerViewController: UIViewRepresentable {
// Provide the player to this swiftui view
var url: URL
var showControls: Bool = true
typealias UIViewType = UIView
func makeUIView(context: UIViewRepresentableContext<PlayerViewController>) -> UIView {
let controller = AVPlayerViewController()
controller.player = AVPlayer(url: url)
controller.showsPlaybackControls = showControls
context.coordinator.controller = controller
return controller.view
}
func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<PlayerViewController>) {
}
func makeCoordinator() -> PlayerViewController.Coordinator {
Coordinator()
}
class Coordinator: NSObject {
var controller: AVPlayerViewController?
deinit {
print("deinit coordinator")
}
}
}
播放器是详细视图的一部分,可以从导航视图中嵌入的列表进行访问,如下所示:
NavigationView {
List {
NavigationLink(destination: DetailView(url: URL("url to movie")))
}
}
DetailView
只需使用提供的网址实例化PlayerViewController
。
我遇到的问题是,如果我在DetailView
中播放电影,当我按下“后退”按钮从DetailView
返回主屏幕时,我仍然可以听到来自movieit显然仍在屏幕外播放。
其他SO问题表明,这是因为在关闭视图后保留了对AVPlayer
的引用。如果为真,我不确定为什么。或者,似乎我没有控制权。
如果在返回主视图并收听了在后台播放的视频后,然后点击另一个列表项,则播放立即停止,并且看到“ deinit coordinator”调试消息。
关闭PlayerViewController并返回主视图时如何停止播放?
答案 0 :(得分:1)
您可以通过添加扩展程序通过viewWillDisappear
方法暂停播放
extension AVPlayerViewController {
open override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.player?.pause()
print("*** Video paused.")
}
}