Cocoa中的兄弟NSView z排序

时间:2013-02-07 11:47:20

标签: macos cocoa core-graphics quartz-graphics

z-ordering如何与Cocoa中的兄弟NSView一起使用?我很困惑因为我在Apple的文档和API中发现了相互矛盾的信息来源。 (注意:子视图显然是在其父视图的顶部呈现的,我在这里明确谈论兄弟视图)。

假设A “是的,您可以定义同级NSViews

的z顺序
  • IB中,您可以将视图放在彼此之上,并且它们将始终按照您期望的方式进行合成。
  • Xcode中的Editor菜单下的按钮名为“Send to Back”,“Send Forward”等。
  • NSView还有一个名为- (void)addSubview:(NSView *)aView positioned:(NSWindowOrderingMode)place relativeTo:(NSView *)otherView;的方法,这似乎意味着定义明确。

假设B “没办法,兄弟NSViews的z顺序在运行时是未定义的。有时候它有效,有时则不然。不要相信它!“

  • Apple的文档(View Programming guide)声明:For performance reasons, Cocoa does not enforce clipping among sibling views or guarantee correct invalidation and drawing behavior when sibling views overlap. If you want a view to be drawn in front of another view, you should make the front view a subview (or descendant) of the rear view.

那是哪一个?

2 个答案:

答案 0 :(得分:3)

是的,NSView兄弟 允许重叠,Apple文档已过时:Are layer-backed NSView siblings allowed to overlap?

此外,z顺序取决于父视图的subviews数组中子视图的顺序。

答案 1 :(得分:2)

我一直在解决同样的问题,并发现至少在Mavericks上它只适用于图层支持的视图。到目前为止,我没有机会在其他OS X版本上测试它,但是对于Mavericks,您必须在要重叠的所有视图上将wantsLayer设置为YES才能使其正常工作