objective-c - 使用 AVPlayerLayer 作为 NSView 的支持层

标签 objective-c macos cocoa core-animation appkit

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

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

由于层托管 View 不能包含 subview ,因此视频控制 View 是视频 View 的同级 View ,并且只是顺序排列在前面,以便它位于视频 View 的顶部。

当前的 View 层次结构似乎对我来说工作得很好,但由于重叠的同级 View (视频控制 View 总是与视频 View 重叠),我仍然对它是否被正式“支持”感到有点困惑。

此堆栈溢出问题:Is there a proper way to handle overlapping NSView siblings?提供有关重叠同级 View 的冲突信息。

我认为处理此问题的更“正确”方法是将视频控件作为视频 View 的 subview ,这只有我将视频 View 从图层托管 View 更改为图层才有可能 -支持的 View 。

默认情况下,图层支持的 View 使用基本 CALayer作为其后备存储,但是 NSView暴露makeBackingLayer允许您返回自定义图层,例如 AVPlayerLayer

通过这样做,并将控件 View 移动为该层支持的视频 View 的 subview ,一切似乎也正常工作,但现在有一个 AVPlayer直接修改 AVPlayerLayer 内容的对象。这似乎违背了以下要求:在图层支持的 View 中,您不应该在不经过 NSView 的情况下修改图层的内容。使用类似drawRect的东西或updateLayer

这似乎给我留下了两个选择,根据我对文档的解释,这两个选择都不“正确”:

选项 1:

  • AVPlayerLayer 的层托管 View
  • 控件 View 的重叠同级 View 。

选项 2:

  • 带有 AVPlayerLayer 的后层 View 通过makeBackingLayer
  • AVPlayer直接修改 AVPlayerLayer 的内容
  • 将控制 View 作为视频 View 的 subview

我倾向于认为选项 #2 是更正确的方法,在这种情况下,对于 AVPlayer 来说是可以的。直接修改AVPlayerLayer的内容尽管它处于分层支持的 View 中,但我不确定并且很好奇其他人是否对这样的设置有任何想法或经验。

最佳答案

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

很难说仅仅因为他们提供了源代码就被认为是最佳实践,但我建议您按照您认为最好的方式构建它。这并不是那些发展得如此充分以至于可能存在最佳实践的领域之一。对我个人来说,使用重叠的同级 View 是最有意义的,以确保您不会扰乱视频渲染。这是否正确可能有些主观。您也许可以访问旧的 Quicktime 开发人员邮件列表之一,甚至可以在 Apple 开发人员论坛上提问。但归根结底,您可能应该坚持使用对您来说最有意义的方法,因为您将来可能会维护或构建它。

关于objective-c - 使用 AVPlayerLayer 作为 NSView 的支持层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29556802/

相关文章:

iphone - 我的开发人员没有使用 Interface Builder,这是一件坏事吗?

macos - 使用 hdiutil 创建磁盘镜像时出错

swift - Swift 是否有与 pdb.set_trace() 等效的函数

iphone - 在应用程序中打开,从 launchOptions 获取 UIApplicationLaunchOptionsURLKey

ios - 如何为 UITableview 中的每个部分制作不同的搜索字段?

macos - 让 Docker for mac 监听 tcp 端口

objective-c - 显示文件夹的内容 Objective-C

macos - 如何为 OSX 创建像 twitter 这样的侧边栏?发展选择建议

ios - NSDateFormatter为什么不解析此日期?

ios - 使用 PFQuery 获取所有 PFUser