Правильный подход UIKit:
Согласно докладу Apple WWDC 2019 на эту тему , AVPlayerViewController
должен быть представлен модально, чтобы воспользоваться всеми последними полноэкранными функциями API,Это рекомендуемый пример кода, который будет вызываться из вашего представления контроллера UIKit:
// Create the player
let player = AVPlayer(url: videoURL)
// Create the player view controller and associate the player
let playerViewController = AVPlayerViewController()
playerViewController.player = player
// Present the player view controller modally
present(playerViewController, animated: true)
Это работает, как ожидалось, и запускает видео в прекрасном полноэкранном режиме.
Достигните того же эффекта сSwiftUI?:
Чтобы использовать AVPlayerViewController
из SwiftUI, я создал реализацию UIViewControllerRepresentable
:
struct AVPlayerView: UIViewControllerRepresentable {
@Binding var videoURL: URL
private var player: AVPlayer {
return AVPlayer(url: videoURL)
}
func updateUIViewController(_ playerController: AVPlayerViewController, context: Context) {
playerController.player = player
playerController.player?.play()
}
func makeUIViewController(context: Context) -> AVPlayerViewController {
return AVPlayerViewController()
}
}
Не могу понять, как это представитьнепосредственно из SwiftUI так же, как AVPlayerViewController
представлен непосредственно из UIKit.Моя цель - получить все полноэкранные преимущества по умолчанию.
Пока что следующее не сработало:
- Если я использую модификатор
.sheet
и представляю его изнутри листа, то проигрыватель встроен влист и не представлены в полноэкранном режиме. - Я также попытался создать в UIKit собственный пустой контроллер представления, который просто представляет мой
AVPlayerViewController
модально из метода viewDidAppear
.Это заставляет проигрыватель работать в полноэкранном режиме, но также показывает пустой контроллер представления перед отображением видео, которое я не хочу, чтобы пользователь видел.
Будем благодарны за любые мысли!