如何在Cocoa应用程序中向NSWindow添加NSView?

时间:2012-09-11 05:58:09

标签: objective-c macos cocoa nsview nswindow

由于Xcode中的OS X应用程序的模板似乎与空的app模板类似,因此以下内容用于添加视图和按钮(现在尝试不使用“界面”构建器):

- (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上的类似代码应该生成一个黄色框和一个按钮,但上面的代码只生成一个按钮,但视图不会显示。上面的代码是否有问题,以及如何使用黄色背景显示视图?

3 个答案:

答案 0 :(得分:18)

使用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]);  

答案 1 :(得分:5)

默认情况下,Cocoa中的

NSView不是图层支持的。我怀疑如果你输入

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

您会看到它是nil

在iOS中,所有视图都有图层。但在OS X上,视图没有图层。此外,在OS X上有2个“模式”的层支持视图。这就是所谓的“层支持视图”和“层托管视图”。图层支持的视图使用CoreAnimation图层来缓存绘制的数据,但不允许您以任何方式与图层交互。图层托管视图使用您明确提供的CALayer,您可能会想要使用该图层。但是,使用图层托管视图,可能不会添加任何子视图,或使用内置的NSView绘图机制。图层托管视图只能用作CoreAnimation图层层次结构的根目录。

考虑到所有这些,您应该完全避免使用CoreAnimation进行查看。

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

答案 2 :(得分:5)

为了扩展Kevin Ballard的建议,执行此操作的经典方法是继承NSView并覆盖-drawRect:方法。 NSRectFill是一个非常方便的函数,用于填充矩形而无需创建贝塞尔曲线路径:

- (void)drawRect:(NSRect)rect
{
    [[NSColor yellowColor] set];
    NSRectFill(rect);
}