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