如何在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]);
NSView
s在Cocoa中默认情况下不支持层。我怀疑如果你输入
NSLog(@"%@", view.layer);
你会看到它是nil
。
在iOS中,所有视图都有图层。但在OS X上,视图没有图层。另外,在OS X上有2层“模式”的层次支持视图。这里有所谓的“层次支持视图”和“图层托管视图”。图层支持的视图使用CoreAnimation图层来缓存绘制的数据,但不允许以任何方式与图层进行交互。图层托管视图使用您明确提供的CALayer
,并且您可能会混淆该图层。但是,使用图层托管视图可能不会添加任何子视图或使用内置的NSView
绘图机制。只能将图层托管视图用作CoreAnimation图层层次结构的根。
考虑到所有这些,你应该尽量避免使用CoreAnimation作为你的视图。
NSBox
可能会做你想做的。您当然可以在那里设置填充颜色,关闭边框并将样式设置为自定义。我只是不是100%确定它将绘制成一个简单的填充矩形的颜色。或者,您可以定义自己的NSView
子类,该子类在-drawRect:
中绘制颜色。
你知道如何使视图显示黄色背景? –
@JeremyL:我现在在研究那个。我主要是做iOS,所以请坚持下去。 –
@JeremyL,我总是像凯文提到的那样,使用NSBox代替自定义视图。只需将其类型设置为自定义,然后您可以(在IB或代码中)设置其背景颜色,边框颜色(如果您选择,则不设边框),并且可以根据需要设置圆角。 – rdelmar
要由凯文·巴拉德建议扩大,经典的方式做,这是继承NSView
并重写-drawRect:
方法。 NSRectFill
用于填充矩形,而无需创建一个贝塞尔路径非常方便的功能:
- (void)drawRect:(NSRect)rect
{
[[NSColor yellowColor] set];
NSRectFill(rect);
}
NSView没有backgroundColor属性,看来。我有点想念'UIKit' ...! –
这个答案不好。你[明确告诉](http://developer.apple。com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html#// apple_ref/doc/uid/20000014-SW61)不支持背景图层查看你在哪里使用过'-setWantsLayer:'而不调用'-setLayer:'第一个)。从文档:**当使用层次支持的视图,你不应该直接与图层** –
直接交互,你应该首先实例化CALayer,将其设置为view.layer,然后将wantsLayer设置为YES,并设置背景颜色? –