Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何在Cocoa应用程序中将NSView添加到NSWindow?_Objective C_Macos_Cocoa_Nsview_Nswindow - Fatal编程技术网

Objective c 如何在Cocoa应用程序中将NSView添加到NSWindow?

Objective c 如何在Cocoa应用程序中将NSView添加到NSWindow?,objective-c,macos,cocoa,nsview,nswindow,Objective C,Macos,Cocoa,Nsview,Nswindow,由于Xcode中OS X应用程序的模板似乎类似于空的应用程序模板,因此以下内容用于添加视图和按钮(暂时不要使用Interface builder): iOS上的类似代码应该产生一个黄色框和一个按钮,但上面的代码只产生一个按钮,但视图不会显示。上述代码是否有问题,以及如何使其以黄色背景显示视图?NSViews在Cocoa中默认不支持图层。我怀疑如果你打字 NSLog(@"%@", view.layer); 您将看到它是nil 在iOS中,所有视图都有层。但在OSX上,视图没有图层。此外,OSX上

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


iOS上的类似代码应该产生一个黄色框和一个按钮,但上面的代码只产生一个按钮,但视图不会显示。上述代码是否有问题,以及如何使其以黄色背景显示视图?

NSView
s在Cocoa中默认不支持图层。我怀疑如果你打字

NSLog(@"%@", view.layer);
您将看到它是
nil

在iOS中,所有视图都有层。但在OSX上,视图没有图层。此外,OSX上有两种“模式”的层备份视图。有所谓的“层备份视图”和“层托管视图”。层备份视图使用CoreAnimation层缓存绘制的数据,但不允许以任何方式与层交互。图层宿主视图使用显式提供的
CALayer
,您可以随意处理该图层。但是,对于图层宿主视图,您不能添加任何子视图,也不能使用内置的
NSView
绘图机制。层宿主视图只能用作CoreAnimation层层次结构的根

考虑到所有这些,您应该完全避免在视图中使用CoreAnimation


有可能安会做你想做的事。您当然可以在此处设置填充颜色,关闭边框,并将样式设置为“自定义”。我只是不能100%确定它会画成一个简单的填充矩形。或者,您可以定义自己的
NSView
子类,该子类在
-drawRect:
中绘制颜色,使用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]);  

为了扩展Kevin Ballard的建议,实现这一点的经典方法是子类化
NSView
,并重写
-drawRect:
方法
NSRectFill
是一个非常方便的函数,用于填充矩形,而无需创建贝塞尔路径:

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

你知道如何制作黄色背景的电视剧吗?@JeremyL:我正在研究。我主要做iOS,所以请稍等。@JeremyL,我总是像Kevin提到的那样,使用NSBox而不是自定义视图。只需将其类型设置为“自定义”,然后(在IB或代码中)就可以设置其背景色、边框颜色(或无边框,如果您选择)和圆角(如果您愿意)。我尝试了一个NSBox,但它有一个“标题”,并且没有背景色property@JeremyL:您可以取消标题,将框类型设置为“自定义”,将边框类型设置为“无”。然后,背景色由
fillColor
控制。我鼓励您创建一个xib,将一个NSBox拖到画布上,并在那里使用属性。NSView似乎没有backgroundColor属性。我有点想念UIKit。。。!这个答案很糟糕。在图层背景视图(使用
-setWantsLayer:
的视图中,未先调用
-setLayer:
),不得触摸背景层。从文档中可以看出:当使用以图层为背景的视图时,您永远不应该直接与图层交互。您的意思是,应该首先实例化一个CALayer,将其设置为view.layer,然后将WantLayer设置为YES,并设置背景色?@JeremyL:否,因为承载视图的图层(如果设置图层,则会得到)不能有任何子视图。如果您希望按钮位于背景之上,则它需要是一个子视图(不具有层次结构的重叠视图可能无法正常工作,如果其中一个是图层宿主,则几乎肯定无法正常工作)。由于按钮需要是子视图,因此黄色背景不能是层宿主视图。如何将自定义类链接到该视图@NSAddict
- (void)drawRect:(NSRect)rect
{
    [[NSColor yellowColor] set];
    NSRectFill(rect);
}