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

Gra*_*ore 20 cocoa objective-c calayer quartz-graphics

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

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];
Run Code Online (Sandbox Code Playgroud)

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

omz*_*omz 55

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

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

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


Amb*_*xon 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]];
Run Code Online (Sandbox Code Playgroud)