将NSView添加到不在顶部的窗口?

时间:2013-10-27 21:46:49

标签: objective-c macos cocoa nsview nswindow

我以编程方式添加子视图并将其添加到主窗口上下文视图以覆盖整个上下文视图,如下所示:

loadingView = [[LoadingView alloc] initWithFrame:[mainWindow.contentView frame]];

NSLog(@"%@", [mainWindow.contentView subviews]);
[mainWindow.contentView addSubview:loadingView];
NSLog(@"%@", [mainWindow.contentView subviews]);

[mainWindow makeFirstResponder:loadingView];

NSLog's确认loadingView子视图中最后添加了contentView。我也尝试过:

loadingView = [[LoadingView alloc] initWithFrame:[mainWindow.contentView frame]];
[mainWindow.contentView addSubview:loadingView positioned:NSWindowAbove relativeTo:nil];
[mainWindow makeFirstResponder:loadingView];

这也不起作用。出于某种原因,窗口底部的两个tableviews(在IB中创建)位于我添加的新视图的顶部。这是窗口的快照,请注意红色部分应该在进度条和几个标签的顶部:

loadingView

同样值得注意的是,视图的alpha设置为0.9,这就是为什么你可以在其背后看到它。

GW

3 个答案:

答案 0 :(得分:1)

如果将一个视图放在另一个视图上方,则上一个视图中的对象将在上方视图中可见。您需要做的是从窗口中删除以前的视图,然后添加一个新的子视图。

尝试使用:

//Create IBOutlet of your tableview in your .h file
IBOutlet NSTableView* yourTableView;

// Add this line where you are adding your subview to remove the tableview from superview.
[yourTableView removeFromSuperview];

// Then add your loading view as the subview
loadingView = [[LoadingView alloc] initWithFrame:[mainWindow.contentView frame]];
[mainWindow.contentView addSubview:loadingView];

然后,只要你想让你的tableView重新使用:

[window contentView]addSubview: yourTableView];

答案 1 :(得分:0)

只要你在这里使用nil,就不会得到可预测的结果。

[mainWindow.contentView addSubview:loadingView locate:NSWindowAbove relativeTo:nil];

如果您还没有这样做,请将所有其他视图放在包含视图中。 使包含视图成为窗口内容视图的直接子视图。 现在使用上面的方法添加子视图,并将nil替换为对包含视图的引用。

答案 2 :(得分:0)

在OS X中,重叠的兄弟姐妹在绘图方面有一些细微差别。在您的情况下,loadingView和两个表视图是兄弟姐妹,因为它们都被添加为窗口内容视图的子视图,并且它们重叠,因此细微差别正在发挥作用。

来自Apple的文档

  

出于性能原因,Cocoa不强制兄弟之间的剪辑   查看或保证正确的失效和绘图行为时   兄弟视图重叠。如果你想在前面绘制一个视图   另一种观点,你应该让前视图成为子视图(或后代)   后视图。

我没有这方面的最终解决方案,但阅读这些可能有助于提高您的长期理解。

http://www.cocoabuilder.com/archive/cocoa/327817-overlapping-sibling-views.html

Is there a proper way to handle overlapping NSView siblings?