我正在尝试创建类似于您在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}}。这似乎与以下要求相反:在图层支持的视图中,您不应使用AVPlayer
或AVPlayerLayer
之类的内容修改图层内容而不通过NSView
。
这似乎给我留下了两个选择,根据我对该文件的解释,这两个选择都不合适:
选项1:
drawRect
选项2:
updateLayer
AVPlayerLayer
的后退视图
直接修改AVPlayerLayer
内容的makeBackingLayer
我倾向于认为选项#2是更正确的方式,在这种情况下,AVPlayer
可以直接修改AVPlayerLayer
的内容,即使它在图层支持的视图,但我不确定,如果其他人对此类设置有任何想法或经验,我会很好奇。
答案 0 :(得分:1)
Apple有一些旧的(古老的计算机术语,2007年!)代码甚至在没有一些调整的情况下甚至无法在Xcode 6中编译。它显示了一些覆盖QuickTime影片图层的控件。在此处下载:https://developer.apple.com/library/mac/samplecode/CoreAnimationQuickTimeLayer/Introduction/Intro.html。
很难说仅仅是因为他们提供的源代码被认为是最佳实践,但我建议您按照您认为最好的方式构建它。这不是一个如此发达的领域之一,因此可能存在最佳实践。对我个人来说,最重要的是使用重叠的兄弟视图,以确保您不会混淆视频渲染。这是否是正确的方式可能有点主观。您可以访问旧的quicktime开发人员邮件列表之一,甚至可以在Apple开发人员论坛上查询。在一天结束的时候,你应该坚持使用对你最有意义的方法,因为你可能会成为将来维护或构建它的人。