2017-06-16 66 views
1

我有一个AVPlayer位于一个collectionView单元格中,位于一个collectionView单元格中的一个collectionView中。传递一个AVPlayerLayer参考向上升级

所以回顾一下,我的每个单元都有一个集合视图。 收藏视图里面有三个单元格。其中一个包含AVPlayer。

我希望这样,当用户点击播放器时,单元格内的视频将动画以包围整个屏幕。

但是,由于播放器位于视图层次结构中,我最初尝试从单元内访问keywindow。它不能超出它所在的collectionView的范围。

最初推荐给我的是,当点击时,删除AVPlayer并将PlayerLayer的引用传递给根视图控制器。但是,我在这样做时遇到麻烦。这是我第一次不得不在层次结构中发送一个引用“up”。

所以我想主要问题是:

究竟如何发送playerLayers视图层次结构中引用了。

还是有可能引用playerLayers初始位置之前抽头,这样我可以无缝地过渡动画效果。

有什么建议吗?

回答

1

我该如何在视图层次结构中向上发送playerLayers引用。

通过授权。当点击CollectionViewCell时,会调用didSelectItemAt(IndexPath)委托函数。您的AVPlayer应该位于某个自定义单元格中(本例中为AVPlayerCVCell),并且它具有AVPlayer属性。检查选中的单元格是否为AVPlayerCVCell,然后可以将根视图控制器的单个AVPlayer设置为该单元格的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 
    } 
} 

自哪里是你的根控制器高度记录。或者你可以有更多的代表层,但那将是如何访问玩家。

就动画而言,我会查看convert(rect: to view:)将一个视图坐标系转换为另一个视图坐标系。您可以获取相对于根控制器的单元坐标,将根控制器的主AVPlayer帧设置为该矩形,比动画显示为全屏。

+0

我该如何使用convert(rect:查看:)这是我迄今为止的,但它没有将fullscreenview cellContentCollectionView?.convert((playerLayer?.frame)!)的框架设置为:fullScreenPlayerView) – Stefan