使用AVPlayerLayer作为NSView的后备层

时间:2015-04-10 08:31:36

标签: objective-c macos cocoa core-animation appkit

我正在尝试创建类似于您在QuickTime播放器等媒体播放查看器中所期望的视图层次结构:

+ Host View
  + Video Controls (NSView layer-backed)
  + Video View (NSView layer-hosted)
    + AVPlayerLayer

由于图层托管视图不能包含子视图,因此视频控件视图是视频视图的同级视图,只需按顺序排序,以便它位于视频视图的顶部。

这个当前的视图层次结构似乎对我来说很好,但是由于重叠的兄弟视图(视频控件视图总是与视频视图重叠),我仍然对它是否正式“支持”感到困惑。

此Stack Overflow问题:Is there a proper way to handle overlapping NSView siblings?提供有关重叠兄弟视图的冲突信息。

我认为处理这种情况的更“正确”的方法是视频控件是视频视图的子视图,这只能将视频视图从图层托管视图更改为图层 - 支持的观点。

默认情况下,图层支持的视图使用基本CALayer作为其后备存储,但NSView公开makeBackingLayer以允许您返回自定义图层,例如{{1} }。

通过这样做,并将控件视图移动为此图层支持的视频视图的子视图,事情似乎也正常工作但现在有一个AVPlayerLayer对象直接修改{{1}的内容1}}。这似乎与以下要求相反:在图层支持的视图中,您不应使用AVPlayerAVPlayerLayer之类的内容修改图层内容而不通过NSView

这似乎给我留下了两个选择,根据我对该文件的解释,这两个选择都不合适:

选项1:

  • drawRect
  • 的图层托管视图
  • 控件视图的重叠兄弟视图。

选项2:

  • 通过updateLayer
  • AVPlayerLayer的后退视图 直接修改AVPlayerLayer 内容的
  • makeBackingLayer
  • 将视图作为视频视图的子视图进行控制

我倾向于认为选项#2是更正确的方式,在这种情况下,AVPlayer可以直接修改AVPlayerLayer的内容,即使它在图层支持的视图,但我不确定,如果其他人对此类设置有任何想法或经验,我会很好奇。

1 个答案:

答案 0 :(得分:1)

Apple有一些旧的(古老的计算机术语,2007年!)代码甚至在没有一些调整的情况下甚至无法在Xcode 6中编译。它显示了一些覆盖QuickTime影片图层的控件。在此处下载:https://developer.apple.com/library/mac/samplecode/CoreAnimationQuickTimeLayer/Introduction/Intro.html

很难说仅仅是因为他们提供的源代码被认为是最佳实践,但我建议您按照您认为最好的方式构建它。这不是一个如此发达的领域之一,因此可能存在最佳实践。对我个人来说,最重要的是使用重叠的兄弟视图,以确保您不会混淆视频渲染。这是否是正确的方式可能有点主观。您可以访问旧的quicktime开发人员邮件列表之一,甚至可以在Apple开发人员论坛上查询。在一天结束的时候,你应该坚持使用对你最有意义的方法,因为你可能会成为将来维护或构建它的人。