将 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 框架设置为该矩形,然后将动画显示为全屏。