YTPlayerView在UICollectionView中滚动时自动播放视频的问题咨询
解决UICollectionView中YTPlayerView滚动时自动播放的问题
我之前也碰到过一模一样的问题,这种情况大概率是UICollectionView的复用机制,或者YTPlayerView内部的事件触发逻辑在搞鬼,给你几个亲测有效的解决方案:
结合UICollectionView可见性回调控制播放状态
这是最直接有效的方案,利用willDisplayCell和didEndDisplayingCell两个方法,精准控制播放器的启停:func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { guard let videoCell = cell as? YourCustomVideoCell else { return } // 先强制关闭自动播放,避免复用带来的意外触发 videoCell.playerView.autoplay = false // 仅当cell完全出现在可视区域时,再按需手动触发播放(如果需要的话) if collectionView.bounds.contains(cell.frame) { // videoCell.playerView.playVideo() } } func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { guard let videoCell = cell as? YourCustomVideoCell else { return } // cell离开屏幕立即停止播放,并重置自动播放状态 videoCell.playerView.stopVideo() videoCell.playerView.autoplay = false }重置复用cell的播放器状态
UICollectionView的cell复用会导致旧的播放器状态被带到新的cell里,一定要在prepareForReuse里彻底重置:class YourCustomVideoCell: UICollectionViewCell { var playerView: YTPlayerView! override func prepareForReuse() { super.prepareForReuse() playerView.stopVideo() playerView.autoplay = false // 可以加载空视频ID来清空播放器内容 playerView.load(withVideoId: "") } }禁用播放器的用户交互(按需)
如果你的场景不需要用户直接点击播放器触发播放,可以先禁用它的交互,避免滚动时的手势被误判为点击事件:videoCell.playerView.isUserInteractionEnabled = false要是需要用户交互,就只在cell完全可见时再开启交互权限。
通过KVO强制管控播放状态
有时候YTPlayerView的autoplay属性会被内部逻辑覆盖,你可以监听它的播放状态,一旦发现非预期的播放就强制暂停:// 在cell初始化时添加监听 playerView.addObserver(self, forKeyPath: "playbackState", options: .new, context: nil) // 实现监听方法 override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if keyPath == "playbackState" { let state = playerView.playbackState() // 这里的isCellVisible需要你自己维护,比如在willDisplay和didEndDisplaying里更新 if state == .playing && !isCellVisible { playerView.stopVideo() } } } // 记得在cell销毁时移除监听 deinit { playerView.removeObserver(self, forKeyPath: "playbackState") }
优先试试前两个方案,基本能解决90%以上的滚动自动播放问题,你可以根据自己的业务场景调整细节。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

