解雇后如何停止将AVPlayerViewController播放为UIViewRepresentable?

时间:2019-11-04 16:34:49

标签: swift swiftui

我创建了一个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并返回主视图时如何停止播放?

1 个答案:

答案 0 :(得分:1)

您可以通过添加扩展程序通过viewWillDisappear方法暂停播放

extension AVPlayerViewController {
    open override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        self.player?.pause()
        print("*** Video paused.")
    }
}