NSView 和 CALayer

NSView and CALayer

在Cocoa上,为了确保视图有自己的图层,您应该将wantsLayer设置为true

wantsLayerwantsUpdateLayer 的确切区别是什么?
据我了解,wantsLayer 导致视图开始使用图层,而 wantsUpdateLayer 改变了视图的绘制方式(通过调用 updateLayer 而不是 draw)。

wantsLayer 设置为真而不将 wantsUpdateLayer 设置为真有什么用?
如果 wantsUpdateLayer 设置为 true,还需要将 wantsLayer 设置为 true 吗?

我应该在哪里与我的视图层交互?
您应该只在 updateLayer 函数中与您的层进行交互,这对吗?这是否适用于每个 属性 和 CALayer 的方法?例如,如果我想添加一个子层,是否也应该在 updateLayer 中完成?

编辑 此外,最新的 AppKit 发行说明指出:

Apps targeting macOS 10.14 should prefer the wantsUpdateLayer property over the wantsLayer property.

这是否意味着在 macOS 10.14 上,如果您已经在使用 wantsUpdateLayer,则实际上不需要使用 wantsLayer ?

wantsLayer 属性 告诉你的 NSView 是否有层支持。默认情况下,NSViews 默认支持 not 层。所以如果你需要一个图层(例如动画),你需要指定它。

wantsUpdateLayer 真的不一样。 NSView 可以通过两种(独家)方式更新其内容:

  • 通过调用 drawRect: 方法
  • 通过调用 updateLayer 方法

默认 wantsUpdateLayer returns NO,因此调用 drawRect:。但是如果您将 wantsUpdateLayer 设置为 return YES(并且如果您的视图是图层支持的),那么将改为调用 updateLayer。

updatelayer 可以比 drawRect 快得多:如果你可以通过修改图层属性来更新你的视图内容

所以回答你的问题:

  • 如果需要在 drawRect 中进行花式绘制,则需要将 wantsLayer 设置为 YES,将 wantsUpdateLayer 设置为 NO:(请记住,updateLayer 速度更快,但您只能修改图层属性)
  • 是的,如果将 wantsUpdateLayer 设置为 YES,则需要将 wantsLayer 设置为 YES
  • 您可以在任何需要的地方与图层属性进行交互,包括来自 drawRect: