2

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

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

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

[mainWindow makeFirstResponder:loadingView];

最后在子视图中添加的NSLog's确认。我也试过:loadingViewcontentView

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

那也没有用。由于某种原因,窗口底部的两个表视图(在 IB 中创建)位于我添加的新视图的顶部。这是窗口的快照,请注意红色部分应该在顶部,带有进度条和一些标签:

加载视图

还值得注意的是,该视图的 alpha 设置为 0.9,这就是为什么您可以看到它背后的原因。

GW

4

3 回答 3

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];
于 2013-10-28T05:48:33.187 回答
0

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

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

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

于 2013-10-28T00:54:51.050 回答
0

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

来自 Apple 的文档

出于性能原因,Cocoa 不强制在同级视图之间进行剪辑,也不保证在同级视图重叠时正确的失效和绘制行为。如果你想在另一个视图前面绘制一个视图,你应该使前视图成为后视图的子视图(或后代)。

我对此没有明确的解决方案,但阅读这些内容应该有助于提高您的长期理解。

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

是否有适当的方法来处理重叠的 NSView 兄弟姐妹?

于 2014-08-26T08:11:25.507 回答