我正在尝试创建一个视图层次结构,类似于您在像QuickTime播放器这样的媒体播放查看器中所期望的那样:
+ Host View
+ Video Controls (NSView layer-backed)
+ Video View (NSView layer-hosted)
+ AVPlayerLayer由于层托管视图不能包含子视图,因此视频控件视图是视频视图的同级视图,并且只是排序-前端,因此它位于视频视图的顶部。
当前的视图层次结构似乎对我很好,但我仍然对它是否被官方“支持”感到有点困惑,因为这些视图是重叠的,兄弟视图(视频控件视图总是与视频视图重叠)。
这个堆栈溢出问题:Is there a proper way to handle overlapping NSView siblings?提供了有关重叠同级视图的冲突信息。
我认为处理这个问题的“正确”方式是让视频控件成为视频视图的子视图,而这只有在我将视频视图从层托管视图更改为层支持视图的情况下才有可能。
默认情况下,层支持视图使用基本CALayer作为其后备存储,但NSView公开makeBackingLayer以允许您返回自定义层(如AVPlayerLayer )。
通过这样做,并将controls视图移动为此层支持的视频视图的子视图,事情似乎也正常工作,但现在有一个AVPlayer对象直接修改AVPlayerLayer的内容。这似乎与这样的要求背道而驰,即在层背景视图中,如果不使用NSView或updateLayer之类的东西,就不应该修改层的内容。
这似乎给我留下了两种选择,根据我对文件的解释,这两种选择都不是“正确的”:
选项1:
AVPlayerLayer的层托管视图备选方案2:
AVPlayerLayer通过makeBackingLayer的层后视图AVPlayerLayer内容的AVPlayerLayer我倾向于认为选项2是更正确的方法,在这种情况下,AVPlayer可以直接修改AVPlayerLayer的内容,即使它在一个层背景视图中,但我不确定,并且会好奇其他人是否对这种设置有任何想法或经验。
发布于 2015-04-21 17:27:27
苹果有一些古老的东西(用电脑来说很古老,2007年!)即使在Xcode 6中不编译的代码,也不需要做一些调整。它显示了一些正在覆盖QuickTime电影层的控件。请在这里下载:https://developer.apple.com/library/mac/samplecode/CoreAnimationQuickTimeLayer/Introduction/Intro.html。
很难这么说,因为他们提供了源代码,它被认为是最佳实践,但我建议您以您认为最好的方式构建它。这不是这些领域中的一个,在这方面发展得如此之快,很可能存在一个最佳做法。对我个人来说,使用重叠的兄弟视图是最有意义的,以确保您不会破坏视频呈现。这是否是正确的方式可能是主观的。您可以访问一个旧的即时开发人员邮件列表,甚至可以在Apple developer论坛上询问。但是,在一天结束时,您可能应该坚持对您来说最有意义的方法,因为您很可能是将来维护或建立在此基础上的方法。
https://stackoverflow.com/questions/29556802
复制相似问题