在 UICollectionViewCell 中滚动时 MPMoviePlayerController 变为空白

Posted

技术标签:

【中文标题】在 UICollectionViewCell 中滚动时 MPMoviePlayerController 变为空白【英文标题】:MPMoviePlayerController goes blank when scrolling in UICollectionViewCell 【发布时间】:2014-02-25 10:49:26 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

我切换到了 AVPlayer,它现在按预期工作。非常感谢!【参考方案2】:

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

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

【讨论】:

以上是关于在 UICollectionViewCell 中滚动时 MPMoviePlayerController 变为空白的主要内容,如果未能解决你的问题,请参考以下文章

在 UICollectionViewCell 中更新 UITableView

如何在 UICollectionViewCell 中添加 UICollectionView?

如何在 UICollectionViewCell 上设置 UILabel?

UICollectionViewCell 边框/阴影

如何在 iOS 7 中刷新 UICollectionViewCell?

UICollectionviewcell 中未显示数据?