【问题标题】:Sibling NSView z-ordering in Cocoa可可中的兄弟 NSView z-ordering
【发布时间】:2013-02-07 11:47:19
【问题描述】:

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

假设A“是的,你可以定义兄弟NSViews的z-order”

  • 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.

那是哪一个?

【问题讨论】:

    标签: macos cocoa core-graphics quartz-graphics


    【解决方案1】:

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

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

    【讨论】:

    • 如果视图没有图层支持怎么办?
    • 不,Apple 文档没有过期。在视图未分层的情况下,有时显示将无法正常工作。上面链接中的 cmets 解释。
    • @dev_null 您能否指定您的意思是哪个链接和哪个 cmets?谢谢!
    • 你的上面:stackoverflow.com/a/10729201/171933,下面是我的cmets。我要说的是,有这样一种 NSView(我不能准确地说在 chromium 浏览器中使用了什么技术),Z 顺序较高的兄弟姐妹将被忽略。我怀疑有任何 opengl 视图就足够了。
    • 您提到子视图数组的顺序使我在文本编辑器中拉出我的 project.xib 并将我的图像视图移动到 数组顶部附近的
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-04
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多