【问题标题】:Subview doesn't appear on Mavericks; works on Mountain LionSubview 没有出现在 Mavericks 上;在山狮上工作
【发布时间】:2014-03-24 23:20:58
【问题描述】:

我在我的 OSX 应用程序中发现了一个我认为是 Mavericks 错误的问题。

我有以下层次结构:

NSView ->NSScrollView ->NSClipView ->NSTableView

当滚动视图不包含任何记录时,我将创建一个覆盖视图作为 NSView 的子视图,并将其定位在其他子视图之上。我这样做是:

[containerView addSubview:overlay
               positioned:NSWindowAbove
               relativeTo:nil];

仅供参考,覆盖视图是一个自定义的 NSView 子类,带有一个 drawRect 来绘制覆盖本身。

在 Mountain Lion 上,这可以正常工作,但在 Mavericks 上,叠加层不会出现。谷歌搜索我认为这是因为覆盖没有位于其他同级视图之上。

我找到了这些链接以供参考:

Display Order Messed Up

Maverick Issue When Adding Subview on NSView (Stack Overflow)

第二个链接建议使用以下代码来解决问题,它似乎可以解决问题,但由于我的应用程序中没有任何支持层的视图,这感觉有点不对劲:

[overlay setWantsLayer:YES];

除了建议的问题之外,任何人都可以建议解决此问题的方法吗?

编辑:我发现如果我在添加子视图后的原始代码中放置一个 Xcode 断点(没有解决方法),则子视图会正确添加,并且我的叠加视图被展示。如果我删除断点,则不再显示覆盖视图。这种行为是否表明了什么?

谢谢

达伦。

【问题讨论】:

  • 首先使用 Xcode 5 查看您使用的任何方法是否已在 10.9 下被弃用。
  • 所有核心方法在 10.9 中似乎都有效。
  • 你不使用类似 constrainScrollPoint 的东西吗?
  • 我绝对不用那个。

标签: objective-c cocoa osx-mavericks nsview subview


【解决方案1】:

看起来你被重叠的视图咬了:

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

来自 Apple 的 Working With A View Heirarchy

正如您所注意到的,解决此问题的常见建议是设置一个图层。但是,从 10.4 开始,您可以使用 setHidden: 隐藏视图,请参阅上述参考中的 隐藏视图。这可能会解决您的特定问题,因为您的重叠似乎是全部的(您不想看到两个视图的一部分,只看到其中一个)。

HTH

【讨论】:

    猜你喜欢
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 2012-11-08
    • 2013-02-08
    • 1970-01-01
    • 2012-11-19
    • 2012-12-06
    相关资源
    最近更新 更多