首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI AVQueuePlayer不更新playerItem

SwiftUI AVQueuePlayer不更新playerItem
EN

Stack Overflow用户
提问于 2020-06-03 10:25:23
回答 1查看 314关注 0票数 0

我试图显示一个循环视频,然后允许用户点击一个按钮来显示下一个或上一个循环视频。

为什么@Binding不更新这个呢?做这件事的正确/最好的方法是什么?

我正在使用UIViewRepresentable。这是我的密码。

代码语言:javascript
复制
struct Player: UIViewRepresentable {

    var videoFileNames: [String]
    @Binding var currentItem: Int

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

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


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

    init(frame: CGRect, videoFileNames: [String], currentItem: Int) {
        super.init(frame: frame)

        var playerItems = [AVPlayerItem]()
        let player = AVQueuePlayer(items: playerItems)

        for videoFileName in videoFileNames {
            guard let path = Bundle.main.path(forResource: videoFileName, ofType: "mp4") else {
                return
            }
            let videoURL = NSURL(fileURLWithPath: path)
            let playerItem = AVPlayerItem(url: videoURL as URL)
            playerItems.append(playerItem)
        }

        playerLooper = AVPlayerLooper(player: player, templateItem: playerItems[currentItem])

        player.volume = 0
        player.play()

        playerLayer.player = player
        playerLayer.videoGravity = .resizeAspectFill 

        layer.addSublayer(playerLayer)
    }

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

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

回答 1

Stack Overflow用户

发布于 2020-06-03 10:53:41

@Binding中的更改只会导致调用updateUIView,因此您需要适应如下所示的内容(在伪代码中,有点抓挠)

代码语言:javascript
复制
struct Player: UIViewRepresentable {

    var videoFileNames: [String]
    @Binding var currentItem: Int

    private var playerView: PlayerView!

    func makeUIView(context: Context) -> UIView {
        let view = PlayerView(frame: .zero, videoFileNames: videoFileNames, currentItem: currentItem)
        self.playerView = view
        return view
    }

    func updateUIView(_ uiView: UIView, context: Context) {
        self.playerView.currentItem = currentItem // update player !!
    }
}

class PlayerView: UIView {
   var currentItem: Int {
       didSet {
          // .. refresh here internal player
       }
   }

    init(frame: CGRect, videoFileNames: [String], currentItem: Int) {
        super.init(frame: frame)

        self.currentItem = currentItem
        var playerItems = [AVPlayerItem]()

   // .. other code
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62170573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档