Как я могу обновить, какое видео воспроизводится на AVPlayerLayer в SwiftUI? - PullRequest
0 голосов
/ 27 апреля 2020

В моем основном ContentView есть переменная @State с именем url , которая является источником файла mp4. Как я могу изменить PlayerView или VideoView (оба ниже), чтобы при изменении содержимого url в ContentView VideoView обновлялся для воспроизведения нового видео с url ?

Мне кажется, что я на правильном пути, добавив координатор в VideoView, но это то, что я видел в руководствах Apple, и я не совсем понимаю, как его использовать.

PlayerView.swift

import UIKit
import AVKit

class PlayerView: UIView {
    private let playerLayer = AVPlayerLayer()
    private var playerLooper: AVPlayerLooper?

    init(frame: CGRect, url: URL) {
        super.init(frame: frame)

        // Obtain asset and create an item from it
        let asset = AVAsset(url: url)
        let item = AVPlayerItem(asset: asset)

        // Create the video player using the URL passed in.
        let player = AVQueuePlayer()

        // Add the player to our Player Layer
        playerLayer.player = player
        playerLayer.videoGravity = .resizeAspect // Resizes content to fill whole video layer.
        playerLayer.backgroundColor = UIColor.black.cgColor
        layer.addSublayer(playerLayer)

        // Create new player looper
        playerLooper = AVPlayerLooper(player: player, templateItem: item)

        // Start the movie
        player.volume = 0
        player.play()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        playerLayer.frame = bounds
    }
}

VideoView (оболочка)

import SwiftUI
import AVKit

struct VideoView: UIViewRepresentable {

    @Binding var videoURL: URL

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func makeUIView(context: Context) -> UIView {
        return PlayerView(frame: .zero, url: videoURL)
    }

    func updateUIView(_ playerView: UIView, context: Context) {
    }

    class Coordinator: NSObject {
        var parent: VideoView

        init(_ videoView: VideoView) {
            self.parent = videoView
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...