Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c CALayerDelegate显示层和NSView更新层之间有什么区别_Objective C_Macos_Cocoa_Nsview_Appkit - Fatal编程技术网

Objective c CALayerDelegate显示层和NSView更新层之间有什么区别

Objective c CALayerDelegate显示层和NSView更新层之间有什么区别,objective-c,macos,cocoa,nsview,appkit,Objective C,Macos,Cocoa,Nsview,Appkit,描述了[CALayerDelegate displayLayer:] 描述了[NSView updateLayer] 它们有何不同?什么时候我可以使用一个而不是另一个?-[NSView updateLayer:] 此方法的目的是被NSView子类覆盖,以便您可以自定义背衬层。默认情况下,将使用,-[NSView drawRect:],并且您不应该像在iOS上使用UIView那样直接操作支持层。如果您想要自定义背衬层,您应该使用-updateLayer并使用此方法执行自定义。要选择使用update

描述了[CALayerDelegate displayLayer:]

描述了[NSView updateLayer]

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

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

用法示例:

@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;
最近我在这个话题上做了一个无耻的插件

-[CALayerDelegate显示层:] 此呼叫是针对CALayer的。如果您没有处理NSView,那么这就是通过调用-[CALayer setNeedsDisplay]通知CALayer需要更改的方式


简而言之,如果您处理的是NSView,并且希望完全控制支持层,那么必须覆盖-wantsUpdateLayer以返回YES并实现-updateLayer。如果您直接使用CALayers而不涉及NSView,那么该代表在这里可能很有用。

以下是我自己的发现

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

CALayer vs.NSViewBackingLayer 如果不重写makeBackingLayer并将wantsLayer设置为“是”,则默认图层类称为_NSViewBackingLayer

其行为方式与CALayer不同,如下所示:

占用的内存明显减少。 设置其transform属性时调用setNeedsDisplay:YES。 也许还有其他方法。。。?
相关回答:为了澄清,我问的是CALayerDelegate的displayLayer:method,不是CALayerOh,我看到你在最后提到了委托。让我的NSView子类符合CALayerDelegate并实现displayLayer会是错误的吗?或者它与实现[NSView updateLayer]大致相同?似乎如果我重写[NSView makeBackingLayer],我需要使用[CALayerDelegate displayLayer:]。你能证实这一点吗?相关回答:@aleclarson抱歉,意思是说CALayer代表,没有呼叫CALayer。makeBackingLayer用于更改NSView使用的backing CALayer类,是的,您可以通过委托回调自行管理它。除非您确实需要不同的子类,否则通常应该避免调用。好的,谢谢!知道从makeBackingLayer返回[CALayer layer]而不是使用默认的_NSViewBackingLayer类有什么缺点吗?