CALayerDelegate displayLayer和NSView updateLayer有什么区别

问题描述 投票:0回答:1

[[CALayerDelegate displayLayer:]被描述为here

[[NSView updateLayer]被描述为here

它们有何不同?我什么时候可以使用另一个?

objective-c macos nsview appkit
1个回答
0
投票

-[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的无耻插件。

-[CALayer displayLayer:]

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

简而言之,如果要处理NSView,并希望完全控制衬里层,则必须重写-wantsUpdateLayer以返回YES并实现-updateLayer。如果您直接使用CALayer(不涉及NSView),则在这里使用委托很有用。

© www.soinside.com 2019 - 2024. All rights reserved.