向上传递 AVPlayerLayer 引用
Posted
技术标签:
【中文标题】向上传递 AVPlayerLayer 引用【英文标题】:passing an AVPlayerLayer reference up heirarchy 【发布时间】:2017-06-16 23:29:04 【问题描述】:我有一个 AVPlayer 位于 collectionView 单元格中,它位于 collectionView 中,位于 collectionView 单元格中。
回顾一下,我的每个单元格中都有一个集合视图。 该集合视图内部是三个单元格。其中之一包含 AVPlayer。
我希望当用户点击播放器时,单元格内的视频会以动画形式覆盖整个屏幕。
我最初尝试从单元格内访问 keywindow,但是,因为播放器在视图层次结构中的位置。它不能超出它所在的 collectionView 的范围。
最初向我推荐的是,当点击时,删除 AVPlayer 并将 PlayerLayer 的引用传递给根视图控制器。但是,我在这样做时遇到了麻烦。这是我第一次不得不在层次结构中“向上”发送引用。
所以我想主要的问题是:
究竟如何在视图层次结构中向上发送 playerLayers 引用。
也可以在点击之前引用 playerLayers 的初始位置,以便我可以无缝地动画过渡。
有什么建议吗?
【问题讨论】:
【参考方案1】:我如何在视图层次结构中向上发送 playerLayers 引用。
通过委托。当一个 CollectionViewCell 被点击时,didSelectItemAt(IndexPath) 委托函数被调用。您的 AVPlayer 应该在某个自定义单元格中(此示例为 AVPlayerCVCell),并且它具有 AVPlayer 属性。检查选定的单元格是 AVPlayerCVCell,然后您可以将根视图控制器的单个 AVPlayer 设置为单元格的。 (可能必须将该单元格的播放器设置为零或其他形式的清理)。注意:以下语法可能略有偏差,但所有内容都高度记录在 the Apple UICollectionView docs.
func collectionView(UICollectionView, didSelectItemAt: IndexPath)
if let playerCell = collectionView.cellForRowAt(indexPath) as? AVPlayerCVCell
let player = playerCell.player
//Do something with player
self.mainPlayer = player
self 是你的根控制器。或者你可以有更多的授权层,但这将是如何访问播放器。
就动画而言,我会研究convert(rect: to view:) 以将一个视图坐标系转换为另一个视图坐标系。您可以获取相对于根控制器的单元格坐标,将根控制器的主 avPlayer 框架设置为该矩形,然后将动画显示为全屏。
【讨论】:
如何使用 convert(rect: 来查看:) 这是我目前所拥有的,但它没有设置全屏视图 cellContentCollectionView?.convert((playerLayer?.frame)! 的框架: fullScreenPlayerView)以上是关于向上传递 AVPlayerLayer 引用的主要内容,如果未能解决你的问题,请参考以下文章
iOS: ios视频播放(MPMediaPlayerController,AVPlayer,AVPlayerViewcontrollerffmpeg-AVPlayer)