向上传递 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)

AVPlayerLayer

AVPlayerLayer 收缩动画

使用 AVPlayerLayer 全屏

在没有动画效果的avplayerlayer上设置videogravity

Swift:调整 AVPlayerLayer 的大小以匹配其父容器的边界