【发布时间】:2020-01-15 22:13:01
【问题描述】:
【问题讨论】:
标签: objective-c macos cocoa nsview appkit
【问题讨论】:
标签: objective-c macos cocoa nsview appkit
-[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),那么委托在这里很有用。
【讨论】:
CALayerDelegate 的displayLayer: 方法,而不是CALayer
NSView 子类符合CALayerDelegate 并实现displayLayer 会不会错?还是和实现[NSView updateLayer]差不多?
[NSView makeBackingLayer],我需要使用[CALayerDelegate displayLayer:]。你能证实这一点吗? (相关回答:stackoverflow.com/a/53288473/2228559)
makeBackingLayer 返回 [CALayer layer] 而不是使用默认的 _NSViewBackingLayer 类有什么缺点吗?
这是我自己的发现。
如果您覆盖-[NSView makeBackingLayer],您必须使用-[CALayerDelegate displayLayer:] 而不是-[NSView updateLayer]。
如果您不覆盖makeBackingLayer 并将wantsLayer 设置为YES,则默认图层类称为_NSViewBackingLayer。
它在以下方面与CALayer 不同:
transform 属性时调用setNeedsDisplay:YES。【讨论】: