SwiftUI: Как правильно представить AVPlayerViewController модально? - PullRequest
1 голос
/ 20 сентября 2019

Правильный подход 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.Это заставляет проигрыватель работать в полноэкранном режиме, но также показывает пустой контроллер представления перед отображением видео, которое я не хочу, чтобы пользователь видел.

Будем благодарны за любые мысли!

1 Ответ

0 голосов
/ 21 сентября 2019

Просто подумайте, если вам нравится полноэкранный режим, подобный UIKit, пробовали ли вы следующий код из ContentView.

import SwiftUI
import UIKit
import AVKit

struct ContentView: View {
    let toPresent = UIHostingController(rootView: AnyView(EmptyView()))
    @State private var vURL = URL(string: "https://www.radiantmediaplayer.com/media/bbb-360p.mp4")
    var body: some View {
        AVPlayerView(videoURL: self.$vURL).transition(.move(edge: .bottom)).edgesIgnoringSafeArea(.all)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}


struct AVPlayerView: UIViewControllerRepresentable {

    @Binding var videoURL: URL?

    private var player: AVPlayer {
        return AVPlayer(url: videoURL!)
    }

    func updateUIViewController(_ playerController: AVPlayerViewController, context: Context) {
        playerController.modalPresentationStyle = .fullScreen
        playerController.player = player
        playerController.player?.play()
    }

    func makeUIViewController(context: Context) -> AVPlayerViewController {
        return AVPlayerViewController()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...