Как представить полноэкранный AVPlayerViewController в SwiftUI - PullRequest
1 голос
/ 20 апреля 2020

В 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)
}

Это не дает вам полноэкранное видео с кнопкой отклонения, а модальный лист, который можно вместо этого сильно ударить .

В стандартном SwiftUI Swift, казалось бы, лучший способ представить этот контроллер ...

let controller = PlayerViewController(videoURL: URL(string: "..."))
self.present(controller, animated: true)

... но SwiftUI не имеет self.present как часть этого. Как лучше всего представить полноэкранное видео в SwiftUI?

1 Ответ

1 голос
/ 24 апреля 2020

Вместо листа я бы использовал решение с ZStack (возможно, с пользовательским переходом при необходимости), как показано ниже

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
    }
}
...