NSView 和 CALayer

Tre*_*vör 3 macos cocoa core-animation swift

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

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

wantsLayer设置为 true 而不设置wantsUpdateLayer为 true有何用处?如果设置为 true
还需要设置wantsLayerto吗?truewantsUpdateLayer

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

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

面向 macOS 10.14 的应用程序应优先使用wantUpdateLayer 属性而不是wantLayer 属性。

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

Air*_*ène 6

wantLayer 属性告诉您的 NSView 是否将由图层支持。默认情况下,NSView 不受支持。因此,如果您需要一个图层(例如用于动画),则需要指定它。

wantUpdateLayer 确实不同。NSView 可以通过两种(独占)方式更新其内容:

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

默认情况下wantUpdateLayer返回NO,因此调用drawRect:。但是如果你设置wantUpdateLayer返回YES(并且如果你的视图是layer-backed的),那么updateLayer将会被调用。

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

所以回答你的问题:

  • 如果你需要在drawRect中进行花哨的绘图,你需要将wantLayer设置为YES,wantUpdateLayer设置为NO:(记住,updateLayer更快,但你只能修改图层属性)
  • 是的,如果将wantUpdateLayer设置为YES,则需要wantLayer为YES
  • 您可以在任何地方与您的图层属性进行交互,包括从drawRect: