在UICollectionViewCell中滚动时,MPMoviePlayerController变为空白

时间:2014-02-25 10:49:26

标签: ios objective-c uicollectionview avfoundation mpmovieplayercontroller

我的UICollectionView有一个水平流布局。每个单元占用整个屏幕并打开分页。每个单元格还包含一个MPMoviePlayerController,我可以毫无问题地播放视频。但是,如果我向左或向右滚动当前显示的电影(此时暂停)消失 - 播放器视图变黑。如果我然后触发播放,则视频会再次出现。我已经尝试在scrollview委托方法中添加prepareToPlay,以某种方式保持视频可见,但没有成功。

2 个答案:

答案 0 :(得分:3)

您一次只能使用MPMoviePlayerController的一个实例。这是MPMoviePlayerController的限制。

在您的情况下,当您开始滚动时,应初始化至少两个MPMoviePlayerController并尝试播放视频。 MPMoviePlayerController无法做到这一点。

如果您想在同一屏幕中同时播放多个视频,可能需要考虑使用AVFoundation。还有基于AVFoundation的开源视频播放器。其中一个比从头创建一个AVFoundation玩家更容易。

答案 1 :(得分:1)

当您滚动集合视图时,视图中的单元格将被集合视图“可重用池”机制重用,因此将删除现有的影片播放器并重置其状态。当单元视图再次可见时,将从池中获取视图(如果池为空,则创建一个新视图),并且需要重新配置它。 在这种情况下你能做些什么:

  • 简单解决方案:为每个集合视图单元格提供唯一标识符(例如,使用单元索引路径坐标),因此不会回收。退回这种方法:如果你有许多单元格,你可能会遇到内存问题,因为每一个新单元格都是从头开始重新创建的;并且电影播放器​​控制器采用不可忽视的内存
  • 更复杂的解决方案:在字典上跟踪每个电影播放器​​状态(播放时间,视频网址,......您可以通过观察其参数或收听其通知来执行此操作),再次按单元索引路径索引。当单元格不在视线范围内时,电影播放器​​会重置,但在重新循环播放时,您可以将电影播放器​​状态重新配置到正确的位置。显然,操作不是即时的(电影播放器​​需要时间来开始渲染视频),但是你不会给你的应用增加额外的内存压力。