如何在Mac OS X上将CALayer添加到NSView

时间:2012-03-04 03:10:59

标签: objective-c cocoa calayer quartz-graphics

我正在尝试学习如何在Mac Objective-C应用程序中使用和实现CALayer,但我似乎无法做最基本的事情 - 添加一个新图层并设置其背景颜色/帧大小。任何人都可以看到我的代码有什么问题吗?

CALayer *layer = [CALayer layer];
[layer setFrame:CGRectMake(0, 0, 100, 100)];
[layer setBackgroundColor:CGColorCreateGenericRGB(1.0, 0.0, 0.0, 1.0)];
[self.layer addSublayer:layer];
[layer display];

我把它放在我的自定义- (void)drawRect:(NSRect)rect子类的NSView方法中,但是当我运行应用程序时,它只显示一个空白视图,没有背景颜色或我创建的图层的证据。

4 个答案:

答案 0 :(得分:54)

首先,您不希望在视图的drawRect:方法中添加图层,系统会自动调用该图层,您最终可能会获得比实际更多的图层想。 initWithFrame:initWithCoder:(对于nib文件中的视图)是初始化图层层次结构的更好位置。

此外,NSView默认情况下没有根图层(这与iOS上的UIView完全不同)。基本上有两种NSView使用图层:layer- 支持视图和layer- 托管视图。如果您想直接与图层交互(添加子图层等),则需要创建图层托管视图。

为此,请创建CALayer并调用视图的setLayer:方法。然后,致电setWantsLayer:。顺序很重要,如果您先调用setWantsLayer:,则实际上是创建了一个支持图层的视图。

答案 1 :(得分:5)

您需要调用“setWantsLayer”方法。

有关setWantsLayer的说明,请查看以下文档: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html

简而言之,您的视图需要是图层托管视图。因为它是一个图层托管视图,所以您应该与图层进行交互,而不是与视图本身交互,也不要向其添加子视图。

[self setLayer:[CALayer new]];
[self setWantsLayer:YES];     // the order of setLayer and setWantsLayer is crucial!
[self.layer setBackgroundColor:[backgroundColor CGColor]];

答案 2 :(得分:1)

将它从drawRect中取出。我通常将我的图层设置放在init方法或viewDidLoad中。

否则,无论何时绘制视图,都会添加并分配新图层。我之前从未使用[图层显示]行。文档实际上告诉您不要直接调用此方法。

答案 3 :(得分:0)

更新的信息(快速):首先调用view.makeBackingLayer(),然后将wantsLayer设置为true。

https://developer.apple.com/documentation/appkit/nsview/1483695-wantslayer