19

由于 Xcode 中 OS X 应用程序的模板似乎类似于一个空的应用程序模板,因此以下用于添加视图和按钮(暂时不使用 Interface builder):

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{       
    NSView *view = [[NSView alloc] initWithFrame:NSMakeRect(100, 100, 100, 100)];

    view.layer.backgroundColor = [[NSColor yellowColor] CGColor];

    [self.window.contentView addSubview:view];

    NSRect frame = NSMakeRect(10, 40, 90, 40);
    NSButton* pushButton = [[NSButton alloc] initWithFrame: frame]; 
    pushButton.bezelStyle = NSRoundedBezelStyle;

    [self.window.contentView addSubview:pushButton];

    NSLog(@"subviews are %@", [self.window.contentView subviews]);   
}

iOS 上的类似代码应该会产生一个黄色框和一个按钮,但上面的代码只产生一个按钮,但视图不会显示。上面的代码有什么问题吗,如何让它以黄色背景显示视图?

4

3 回答 3

21

NSView 类的使用setWantsLayer:方法。

NSView *view = [[NSView alloc] initWithFrame:NSMakeRect(100, 100, 100, 100)];
[view setWantsLayer:YES];
view.layer.backgroundColor = [[NSColor yellowColor] CGColor];

[self.window.contentView addSubview:view];

NSRect frame = NSMakeRect(10, 40, 90, 40);
NSButton* pushButton = [[NSButton alloc] initWithFrame: frame]; 
pushButton.bezelStyle = NSRoundedBezelStyle;

[self.window.contentView addSubview:pushButton];

NSLog(@"subviews are %@", [self.window.contentView subviews]);  
于 2012-09-11T06:39:13.323 回答
6

为了扩展 Kevin Ballard 的建议,执行此操作的经典方法是子类NSView化并覆盖该-drawRect:方法。NSRectFill是一个非常方便的函数,无需创建贝塞尔路径即可填充矩形:

- (void)drawRect:(NSRect)rect
{
    [[NSColor yellowColor] set];
    NSRectFill(rect);
}
于 2013-03-21T11:59:35.157 回答
5

NSView默认情况下,Cocoa 中的 s 不是层支持的。我怀疑如果你输入

NSLog(@"%@", view.layer);

你会看到它是nil

在 iOS 中,所有视图都有层。但是在 OS X 上,视图没有层。此外,在 OS X 上还有 2 种 layer-backed view 的“模式”。有所谓的“layer-backed views”和“layer-hosting view”。layer-backed view 使用 CoreAnimation layer 来缓存绘制的数据,但是你不能以任何方式与 layer 交互。图层托管视图使用CALayer您明确提供的 a,您可以随心所欲地弄乱该图层。但是,使用图层托管视图,您可能不会添加任何子视图,或使用内置的NSView绘图机制。层托管视图只能用作 CoreAnimation 层层次结构的根。

鉴于这一切,您可能应该完全避免在视图中使用 CoreAnimation。

an 可能NSBox会做你想做的事。您当然可以在那里设置填充颜色,关闭边框并将样式设置为自定义。我只是不能 100% 确定它会画成一个简单的填充颜色矩形。或者,您可以定义自己的NSView子类,在-drawRect:.

于 2012-09-11T06:01:06.303 回答