我正在尝试学习如何在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
方法中,但是当我运行应用程序时,它只显示一个空白视图,没有背景颜色或我创建的图层的证据。
答案 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