【问题标题】:What's the difference between CALayerDelegate displayLayer and NSView updateLayerCALayerDelegate displayLayer 和 NSView updateLayer 有什么区别
【发布时间】:2020-01-15 22:13:01
【问题描述】:

[CALayerDelegate displayLayer:] 被描述为here

[NSView updateLayer] 被描述为here

它们有何不同?我什么时候会使用其中一个?

【问题讨论】:

标签: objective-c macos cocoa nsview appkit


【解决方案1】:

-[NSView updateLayer:]

此方法的目的是被NSView 子类覆盖,以便您可以自定义支持层。默认情况下,-[NSView drawRect:] 将被使用,并且您不应该直接操作支持层(就像您在 iOS 上可能使用 UIView 一样)。如果您想自定义支持层,您应该使用-updateLayer 并在此方法中执行您的自定义。要选择使用updateLayer 而不是drawRect:,请覆盖-[NSView wantsUpdateLayer] 并返回YES。现在您可以更改-updateLayer 内支持层上的任何属性。要通知视图需要发生更改,您可以使用needsDisplay 属性并将其设置为YES,这将在执行渲染传递时触发-updateLayer。了解控制何时触发重绘的layerContentsRedrawPolicy 属性也很好。

示例用法:

@implementation MyView

- (BOOL)wantsUpdateLayer {
    return YES;
}

- (void)updateLayer {
    // Perform different customizations based on view/control state.
    self.layer.backgroundColor = NSColor.redColor.CGColor;
    self.layer.contents = <some image>;
}

@end

// Example of notifying MyView instance that it needs to update itself
myView.needsDisplay = YES;

video 的无耻插件我最近在这个话题上做了一些。

-[CALayerDelegate displayLayer:]

此调用特定于 CALayer。如果您不处理 NSView,那么您可以通过调用 -[CALayer setNeedsDisplay] 来通知您 CALayer 需要更改。

简而言之,如果您正在处理NSView 并希望完全控制支持层,则必须覆盖-wantsUpdateLayer 以返回YES 并实现-updateLayer。如果您直接使用CALayers(不涉及NSView),那么委托在这里很有用。

【讨论】:

  • 澄清一下,我问的是CALayerDelegatedisplayLayer: 方法,而不是CALayer
  • 哦,我看到你在最后提到了代表。让我的NSView 子类符合CALayerDelegate 并实现displayLayer 会不会错?还是和实现[NSView updateLayer]差不多?
  • 看来如果我覆盖[NSView makeBackingLayer],我需要使用[CALayerDelegate displayLayer:]。你能证实这一点吗? (相关回答:stackoverflow.com/a/53288473/2228559
  • @aleclarson 抱歉,我的意思是说 CALayerDelegate,CALayer 上没有调用。 makeBackingLayer 用于更改 NSView 使用的支持 CALayer 类,是的,您可以自己通过委托回调来管理它。除非您确实需要不同的子类,否则通常应避免调用。
  • 好的,谢谢!知道从 makeBackingLayer 返回 [CALayer layer] 而不是使用默认的 _NSViewBackingLayer 类有什么缺点吗?
【解决方案2】:

这是我自己的发现。

如果您覆盖-[NSView makeBackingLayer],您必须使用-[CALayerDelegate displayLayer:] 而不是-[NSView updateLayer]


CALayer 与 NSViewBackingLayer

如果您不覆盖makeBackingLayer 并将wantsLayer 设置为YES,则默认图层类称为_NSViewBackingLayer

它在以下方面与CALayer 不同:

  • 占用的内存明显减少。
  • 在设置transform 属性时调用setNeedsDisplay:YES
  • 也许还有其他方式...?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    相关资源
    最近更新 更多