如何在UITableViewCell中处理AVPlayer?

时间:2016-11-29 16:30:23

标签: ios swift

我试图找出如何在AVPlayer内成功使用UITableViewCell。在我的UITableViewCell内,我有一个UIView子类,里面有AVPlayerLayer使用此代码(由Apple提供):

class PlayerView: UIView {
    var player: AVPlayer? {
        get {
            return playerLayer.player
        }
        set {
            playerLayer.player = newValue
        }
    }

    var playerLayer: AVPlayerLayer {
         return layer as! AVPlayerLayer
    }

    override class var layerClass : AnyClass {
         return AVPlayerLayer.self
    }

}

我使用以下代码在player中设置了-cellForRowAtIndexPath:

let videoPlayer = AVPlayer(playerItem: AVPlayerItem(asset: cellVideo))
cell.playerView.player = videoPlayer

这很好,但是,当单元格不在视野范围内时,我不想播放视频。我应该将player设置为nil,然后当再次显示该单元格时再次设置player,还是应该暂停视频?或者我还有其他方法可以使用吗?

2 个答案:

答案 0 :(得分:0)

您可以实现此UITableViewDelegate方法,以便在单元格不在视图中时执行所需操作:

optional func tableView(_ tableView: UITableView, 
   didEndDisplaying cell: UITableViewCell, 
           forRowAt indexPath: IndexPath) {

}

我个人停止视频并将播放器设置为nil,因为当一个单元格可见时调用cellForRowAt indexPath

答案 1 :(得分:0)

修改

是的,您应该将播放器设置为nil以提高性能。 我认为您还应该通过覆盖准备重用方法将播放器设置为自定义单元类中的nil。

override func prepareForReuse() {
    player = nil
    super.prepareForReuse()
}

此外,如果您的目标是模仿新闻源行为,我建议您查看AVPlayer:PrerollAtRate它让您在特定时间显示拇指。

您可以使用委托方法暂停和恢复播放器。 只需确保将UITableViewCell转换为自定义类

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

    //cast the cell as your custom cell
    if let myCell = cell as? MyCustomCell
    {
        myCell.player!.play()
    }

}


func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {

    //cast the cell as your custom cell
    if let myCell = cell as? MyCustomCell
    {
        myCell.player!.pause()
    }

}