将 AVPlayerLayer 引用传递到层次结构中
passing an AVPlayerLayer reference up heirarchy
我有一个位于 collectionView 单元格中的 AVPlayer,它位于 collectionView 单元格中。
总而言之,我的每个单元格中都有一个集合视图。
在该集合视图中是三个单元格。其中之一包含 AVPlayer。
我想要它,以便当用户点击播放器时,单元格内的视频动画覆盖整个屏幕。
我最初尝试从单元格内访问 keywindow,但是,因为播放器在视图层次结构中的位置。它不能超出它所在的 collectionView 的边界。
最初向我推荐的是,当点击时,删除 AVPlayer 并将 PlayerLayer 的引用传递给根视图控制器。但是,我在这样做时遇到了麻烦。这是我第一次必须在层次结构中发送参考 "up"。
所以我想主要问题是:
如何在视图层次结构中向上发送 playerLayers 引用。
也可以在点击之前引用 playerLayers 的初始位置,以便我可以无缝地设置动画过渡。
有什么建议吗?
How exactly do I send the playerLayers reference up in the view hierarchy.
通过授权。点击 CollectionViewCell 时,将调用 didSelectItemAt(IndexPath) 委托函数。您的 AVPlayer 应该在某个自定义单元格中(本例中为 AVPlayerCVCell)并且它有一个 AVPlayer 属性。检查所选单元格是否为 AVPlayerCVCell,然后您可以将根视图控制器的单个 AVPlayer 设置为单元格的单个 AVPlayer。 (可能必须将该单元格的播放器设置为 nil 或某种其他形式的清理)。注意:以下语法可能略有偏差,但所有内容都在 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 框架设置为该矩形,然后将动画显示为全屏。
我有一个位于 collectionView 单元格中的 AVPlayer,它位于 collectionView 单元格中。
总而言之,我的每个单元格中都有一个集合视图。 在该集合视图中是三个单元格。其中之一包含 AVPlayer。
我想要它,以便当用户点击播放器时,单元格内的视频动画覆盖整个屏幕。
我最初尝试从单元格内访问 keywindow,但是,因为播放器在视图层次结构中的位置。它不能超出它所在的 collectionView 的边界。
最初向我推荐的是,当点击时,删除 AVPlayer 并将 PlayerLayer 的引用传递给根视图控制器。但是,我在这样做时遇到了麻烦。这是我第一次必须在层次结构中发送参考 "up"。
所以我想主要问题是:
如何在视图层次结构中向上发送 playerLayers 引用。
也可以在点击之前引用 playerLayers 的初始位置,以便我可以无缝地设置动画过渡。
有什么建议吗?
How exactly do I send the playerLayers reference up in the view hierarchy.
通过授权。点击 CollectionViewCell 时,将调用 didSelectItemAt(IndexPath) 委托函数。您的 AVPlayer 应该在某个自定义单元格中(本例中为 AVPlayerCVCell)并且它有一个 AVPlayer 属性。检查所选单元格是否为 AVPlayerCVCell,然后您可以将根视图控制器的单个 AVPlayer 设置为单元格的单个 AVPlayer。 (可能必须将该单元格的播放器设置为 nil 或某种其他形式的清理)。注意:以下语法可能略有偏差,但所有内容都在 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 框架设置为该矩形,然后将动画显示为全屏。