NSOutlineView折叠三角形垂直偏离中心

3
我正在为 macOS 应用程序使用 NSOutlineView,并提供可展开的项目的披露三角形。
我还创建了自定义的 NSTableCellView 项,而不是使用基本的单元格项。这使我可以按照自己的视觉需求创建单元格。
我的问题是,当它们被显示时,左侧的披露三角形在垂直方向上没有居中。

enter image description here

请注意披露三角形未对齐。它们比应该低一点。如果您滚动并返回,有时它们会自动正确对齐。有人能够在此之前解决此问题吗?
值得一提的是,我也在为单元格使用以下代码。
self.outlineView.rowHeight = CGFloat(integerLiteral: 66)
self.outlineView.usesAutomaticRowHeights = true
2个回答

3

对于像我这样很多年后遇到这个问题的人,这是适合我的修复方法,而且需要更少的工作。

NSOutlineView有一个函数frameOfOutlineCell(atRow:)文档中说明:您可以在子类中重写此方法,以返回大纲按钮单元格的自定义框架

您可以重写该方法,以便提供实际位于行垂直中心的框架。从试错中学到的一个重要点是,您甚至不需要提供更新的框架。不确定这是否是错误或其他什么原因,但对我来说,在函数覆盖中只调用super.frameOfOutlineCell(atRow: row)就足以使披露指示器出现在正确位置。

所以我的NSOutlineView子类是这样的:

class MyOutlineView: NSOutlineView {
    override func frameOfOutlineCell(atRow row: Int) -> NSRect {
        super.frameOfOutlineCell(atRow: row)
    }
}

就是这样。希望这对其他人也有用!


1
@RL2000 这个完美运作!感谢您的努力和出色的回答! - Yoshiharu Yamada

1
很难在不看到您如何设置项目的情况下弄清楚问题所在,但我会尽力解决。
首先,当将usesAutomaticRowHeights设置为true时,大纲视图使用自动布局来定位单元格视图。因此,您需要在Storyboard或Nib文件中利用约束条件,否则事情会变得奇怪(参见:您的图片)。如果我猜测正确,您在Interface Builder中设置的原型单元格视图正在将其autoresizingMask转换为自动布局约束条件(通常会引起大量问题)。
我会这样做:
  1. 打开包含大纲视图的故事板或 Nib 文档。
  2. 在左侧画布旁边的文档大纲中找到包含街道名称文本字段的原型 NSTableCellView 实例。(如果您看不到文档大纲,可以点击主菜单中的 编辑器 » 显示文档大纲 项来打开它)。
  3. 接下来,检查是否已经存在约束。如果有,请通过选择位于“所有视图 in ${YOUR_SCENE}”标题下的 编辑 » 解决自动布局问题 » 清除约束 菜单项来移除它们。
  4. 现在,根据你想要的效果,有不同的方法来设置约束,但是这里我建议的方式是这样的。假设你想让街道名称与披露三角形垂直居中,那么我会在文本字段和其父级单元格视图之间添加一个垂直约束,如下所示:

    1. 在文档大纲中选择文本字段,单击 Interface Builder 主画布区域右下角的 对齐 图标(见图片)。
    2. 在弹出的窗口中,勾选 容器垂直居中 复选框。
    3. 在窗口右侧的文本字段中,输入“0”的值。
    4. 最后,单击 “添加 1 个约束”按钮。

Adding a vertical constraint to a view in Interface Builder

你可能会看到一个红色的错误(或黄色的警告)标志出现,因为视图现在已经选择了自动布局,但它只有垂直位置的度量。所以我们现在需要添加一些约束条件来描述文本字段在x轴上应该被定位的位置。像之前一样,我们将使用画布右下角的弹出按钮定义约束条件:
1. 点击“添加新的约束”按钮(位于“对齐”按钮右侧)。 2. 在弹出窗口顶部的图表上,单击白色矩形左右两侧的淡红色线条。这告诉界面构建器我们要添加前导和尾随约束。 3. 现在,在每个文本字段的两侧输入你想要的填充值。在示例图片中,我选择了每个侧面都为“4”个点,但显然,你可以使用任何你认为最适合你的布局的值。 4. 最后,点击“添加2个约束”按钮。

Adding horizontal constraints to a view in Interface Builder

任何警告现在都应该消失了,因为我们已经添加了足够的约束来描述文本字段的位置。理论上,您现在应该能够构建和运行您的项目,并且文本字段应该与披露三角形对齐。话虽如此,布局出现问题有很多其他原因,考虑到usesAutomaticRowHeights是macOS High Sierra中的新API(而Steve Jobs不再在那里教导苹果开发人员使一切都正常工作™),我可能不知道存在的问题。

或者,您可以将usesAutomaticRowHeights设置为false,并让某些对象(例如视图控制器、NSObject子类等)符合NSOutlineViewDelegate协议并实现outlineView(_:heightOfRowByItem:)方法返回您想要的任意高度以适应不同的行。通过这种方式调整行的大小的好处是,您可以允许某些行更大或更小,具体取决于相应项的角色。有很多关于此的教程,所以我不会在这里重复一个不成熟的解释,但是可以随时在Google上搜索“符合NSOutlineViewDelegate协议”获取更多信息。

无论如何,尝试以上步骤,看看它们是否对您有所帮助,如果没有,请告诉我。我可以和您一起深入探讨,只要您需要,随时提问。祝您好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接