Я создал UIViewRepresentable версию AVPlayerViewController для воспроизведения фильмов с использованием 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, например:
NavigationView {
List {
NavigationLink(destination: DetailView(url: URL("url to movie")))
}
}
DetailView
просто создает экземплярыPlayerViewController
с предоставленным URL.
Проблема, с которой я сталкиваюсь, заключается в том, что если я проигрываю фильм в DetailView
, когда я нажимаю кнопку "Назад", чтобы вернуться с DetailView
на главный экран, япо-прежнему можно слышать звук из фильма, который явно воспроизводится за кадром.
Другие вопросы SO указывают на то, что это связано с тем, что ссылка на AVPlayer
сохраняется после отклонения вида. Если это правда, я не уверен почему;или, похоже, я не контролирую это.
Если после возвращения к основному виду и прослушивания видео, воспроизводимого в фоновом режиме, я затем нажимаю на другой элемент списка, воспроизведение немедленно останавливается, и ясм. отладочное сообщение «deinit Координатор».
Как я могу остановить воспроизведение, когда PlayerViewController закрывается и пользователь возвращается к основному виду?