【问题标题】:NSSplitViewController causing contained views to draw over window cornersNSSplitViewController 导致包含的视图在窗口角上绘制
【发布时间】:2016-04-06 23:55:10
【问题描述】:

我正在尝试使用 Cocoa 创建一个小的 Finder 克隆。我在由NSSplitViewController 控制的NSSplitView 内放置了一个源列表表视图(用作侧边栏)和一个标准表视图。 不幸的是,当我运行它时,标准表格视图的白色背景被绘制在窗口的右下角,导致一个非圆角:

我可以通过不使用 NSSplitViewController 来避免这个问题,无论是使用标准 nib 文件还是情节提要来获得所需的结果:

但是……我真的很想用NSSplitViewController。有什么办法可以防止这种情况发生吗?

Here is the Xcode workspace with the projects 用于截图。

【问题讨论】:

    标签: macos cocoa xcode-storyboard nssplitviewcontroller


    【解决方案1】:

    我见过这样的问题,它似乎是真正的错误。但是有解决方法。您需要确保 NSSplitViewController 在由 CA 层支持的视图中呈现自身。因此,为了在您的项目中执行此操作,我添加了带有容器视图的中间人视图控制器。然后我将你的拆分视图放在这个容器视图中。最后,容器视图的父视图设置为支持层。这是图片:

    之后我可以看到一切正常:

    另外注意:确保在真正需要之前不要使用 1000 优先级的约束。我通常使用 750(我也修复了它)。否则你会收到很多关于不满意的事情的警告。

    这是你固定的项目: https://github.com/emankovski/splitviewroundcorrners

    【讨论】:

    • 支持窗口内容视图的图层对性能和电池寿命的影响有多大?据推测,为什么视图默认不支持图层肯定是有原因的?我已经下载了固定项目并将所有约束优先级更改为 1000,并且似乎没有收到任何无法满足的约束错误。我最初使用 1000 是因为这是 IB 中的默认值,尽管我可以看到它并不总是最合适的。
    • 它实际上会提高你的电池寿命。支持层的视图利用 GPU。理论上,每个视图都应该像 iOS 中那样分层。但是因为 CA 是后来添加到 Mac 中的,所以有一些建议谨慎使用层,因为它们会占用更多的内存。同时,当前的 macbook 具有大量 RAM,因此即使过度使用层支持的视图也不应该成为问题。默认情况下不检查图层,因为它们添加到 Mac 的方式晚于创建平台。
    【解决方案2】:

    确保视图层次结构中的根视图在之前添加到视图层次结构中。

    示例。这行得通。经测试并确认可在 macOS 10.12 Sierra 中使用。 Xcode 8.0。

    split.view.wantsLayer = true
    window.contentViewController = split
    split.splitViewItems = [
        NSSplitViewItem(viewController: vc),
    ]
    

    但事实并非如此。

    window.contentViewController = split
    split.splitViewItems = [
        NSSplitViewItem(viewController: vc),
    ]
    split.view.wantsLayer = true
    

    我不知道这里发生了什么,以及为什么会这样。但让我推测一下。

    NSWindow 没有图层支持的根视图只是天真地绘制,不涉及合成器。所以他们不能掩盖角落,这样的伪影就会出现。只要让它们有层支持就可以了。正如@Eugene 指出的那样。

    让所有东西都有层支持并不难。只需将根视图设置为支持层,层次结构中的每个子视图都将支持层支持到叶子。 (RTFM 详情:CALayer.wantsLayer。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      相关资源
      最近更新 更多