繁体   English   中英

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

[英]Adding NSView to window not on top?

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

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];

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

loadingView

还值得注意的是,该视图的Alpha值设置为0.9,这就是为什么您可以在其后面有所看到的原因。

GW

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

尝试使用:

//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];

只要您在此处使用nil,就不会得到可预测的结果。

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

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

在OS X中,重叠的同级元素在绘制时会有一些细微差别。 在您的情况下,loadingView和两个表视图是同级的,因为它们都被添加为窗口内容视图的子视图,并且它们重叠,因此细微差别开始发挥作用。

从苹果的文档

出于性能方面的考虑,当同级视图重叠时,Cocoa不会在同级视图之间强制剪切或保证正确的无效和绘制行为。 如果要在另一个视图前面绘制一个视图,则应将前视图作为后视图的子视图(或后代)。

我没有确定的解决方案,但是长期阅读这些内容将有助于提高您的理解能力。

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

有正确的方法来处理重叠的NSView兄弟姐妹吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM