如何使用Loader在UICollectionViewcell中显示AVPlayer



我需要在CollectionviewCell中显示Avplayer和Loading视图(活动指示器(。下面是我尝试的代码

UIcollectionViewCell:-单元格内容视图包含视图&视图中的一些按钮(如,评论,分享(我需要显示avplayer。Videodict是字典的数组。

每次滚动时,我都会调用web服务获取另一本词典&在VideoDict 中添加

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
{
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! UICollectionViewCell

let playerView = cell.contentView.viewWithTag(1)

player = AVPlayer(url: URL(string: videodict[indexPath.item]["vid_url"] as! String)!)
playerLayer = AVPlayerLayer(player: player)
playerLayer?.frame = cell.contentView.frame
playerLayer?.videoGravity = .resizeAspectFill
playerView!.layer.addSublayer(playerLayer!)
player?.currentItem!.addObserver(self, forKeyPath: "“timeControlStatus”", options: [.old, .new], context: nil)
player?.play()
return cell
}

Observer方法

override public func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?)
{
if keyPath == "timeControlStatus", let change = change, let newValue = change[NSKeyValueChangeKey.newKey] as? Int,let oldValue = change[NSKeyValueChangeKey.oldKey] as? Int
{
let oldStatus = AVPlayer.TimeControlStatus(rawValue: oldValue)
let newStatus = AVPlayer.TimeControlStatus(rawValue: newValue)
if newStatus != oldStatus
{
DispatchQueue.main.async {[weak self] in
if newStatus == .playing || newStatus == .paused
{
LoaderView.show()
}
else
{
LoaderView.hide()
}
}
}
}
}

视频正在CollectionViewCell中播放,但ObserverValue函数未调用&是在收藏视图中播放视频的最佳方式。

试着如下观察timeControlStatus

var timeControlStatusObserver: NSKeyValueObservation?
timeControlStatusObserver = self.avPlayer.observe(.timeControlStatus, options: [.new, .initial], changeHandler: {[weak self] (player, status) in
if let self = self,let status = status.newValue {
switch status {
case .paused:
print("status paused")
case .waitingToPlayAtSpecifiedRate:
print("status waitingToPlayAtSpecifiedRate")
case .playing:
print("status playing")
@unknown default:
print("status unknown")
}
}
})

不要忘记在deinit中取消初始化类之后调用timeControlStatusObserver.invalidate()

最新更新