2012-03-04 96 views
17

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

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]; 

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

回答

48

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

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

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

+0

谢谢你这个有用的答案,我想也许没有附加到nsview的基本层 – 2013-12-08 16:13:14

1

把它放在drawRect中。我通常把我的图层设置在init方法或viewDidLoad中。

否则,任何时候视图绘制都会添加并分配一个新图层。此外,我从未使用过[图层显示]行。文档实际上告诉你不要直接调用这个方法。

+0

感谢您的回复,但这仍然没有改变任何东西。该视图仍然是空白的。顺便说一句我想创建一个mac os x应用程序,所以我不能调用viewDidLoad。 – GravityScore 2012-03-04 03:39:50

+0

哦,对不起,我错过了。窗口加载时必须有一些初始化方法。我不熟悉Mac编程,但我知道iOS需要导入QuartzCore以使CALayer适用(我不想假设你知道这一点)。你也可以尝试直接操作根层,看看它是否工作([self.layer setBackgroundColor:...])。 – atreat 2012-03-04 03:48:47

4

您需要调用“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]];