如何在Cocoa应用程序中添加一个NSView到NSWindow?

如何在Cocoa应用程序中添加一个NSView到NSWindow?

问题描述:

由于在Xcode的OS X应用程序的模板似乎是类似于一个空的应用程序模板,用于添加一个视图和一个按钮(尽量不使用Interface Builder现在)如下:如何在Cocoa应用程序中添加一个NSView到NSWindow?

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

使用setWantsLayer: NSView类的方法。

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]); 
+0

NSView没有backgroundColor属性,看来。我有点想念'UIKit' ...! –

+5

这个答案不好。你[明确告诉](http://developer.apple。com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html#// apple_ref/doc/uid/20000014-SW61)不支持背景图层查看你在哪里使用过'-setWantsLayer:'而不调用'-setLayer:'第一个)。从文档:**当使用层次支持的视图,你不应该直接与图层** –

+0

直接交互,你应该首先实例化CALayer,将其设置为view.layer,然后将wantsLayer设置为YES,并设置背景颜色? –

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

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

你会看到它是nil

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

考虑到所有这些,你应该尽量避免使用CoreAnimation作为你的视图。

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

+0

你知道如何使视图显示黄色背景? –

+0

@JeremyL:我现在在研究那个。我主要是做iOS,所以请坚持下去。 –

+0

@JeremyL,我总是像凯文提到的那样,使用NSBox代替自定义视图。只需将其类型设置为自定义,然后您可以(在IB或代码中)设置其背景颜色,边框颜色(如果您选择,则不设边框),并且可以根据需要设置圆角。 – rdelmar

要由凯文·巴拉德建议扩大,经典的方式做,这是继承NSView并重写-drawRect:方法。 NSRectFill用于填充矩形,而无需创建一个贝塞尔路径非常方便的功能:

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