NSOutlineView显示三角形垂直偏离中心

时间:2017-11-24 22:35:24

标签: swift macos cocoa nsoutlineview

我在macOS应用上使用NSOutlineView,它为可以展开的项目提供了显示三角形。

我也在创建自定义NSTableCellView项,而不是使用基本单元格项。这允许我在视觉上创建我想要的单元格。

我的问题是,当它们显示时,左侧的显示三角形不会垂直居中。

enter image description here

请注意披露三角形未正确对齐的方式。它们比它们应该低一点。如果您滚动并返回,有时,它们会自动正确对齐。有没有人能够解决这个问题?

对于它的价值,我也使用以下代码来处理单元格。

self.outlineView.rowHeight = CGFloat(integerLiteral: 66)
self.outlineView.usesAutomaticRowHeights = true

1 个答案:

答案 0 :(得分:0)

如果不了解你如何设置你的项目,很难弄清楚问题是什么,但是我会试一试。

首先,当usesAutomaticRowHeights设置为true时,大纲视图使用自动布局来定位单元格视图。因此,您需要在Storyboard或Nib文件中使用约束,否则会出现奇怪的行为(请参阅:您的图片)。如果我不得不猜测,您在Interface Builder中设置的原型单元格视图将其autoresizingMask转换为自动布局约束(通常会导致大量问题)。

我要做的是:

  1. 打开包含大纲视图的Storyboard或Nib文档。
  2. 在画布左侧的“文档大纲”中找到包含街道名称文本字段的原型NSTableCellView实例。 (如果没有看到文档大纲,可以通过单击主菜单中编辑器»显示文档大纲中的项目打开它。
  3. 接下来,看看您是否有任何约束。如果您这样做,请在菜单项“部分”下选择编辑器»解决自动布局问题»清除约束,将其删除,标题为 $ {YOUR_SCENE} 中的所有视图。
  4. 现在,根据你的目标,有不同的方法可以设置约束,但这就是我的建议。假设您希望街道名称与显示三角形垂直居中,我会在文本字段和其父单元格视图之间添加一个垂直约束,如下所示:

    1. 在文档大纲中选择文本字段后,单击Interface Builder主画布区域右下角的对齐图标(参见图像)。
    2. 在显示的弹出窗口中,选中垂直容器旁边的复选框。
    3. 在弹出式窗口右侧的文本字段中,输入值“0”
    4. 最后,点击“添加1约束”按钮。
  5. Adding a vertical constraint to a view in Interface Builder

    您可能会看到一个红色错误(或黄色警告)符号显示,因为视图现在已选择自动布局,但它只有一个垂直位置的指标。所以我们现在需要添加一些约束来描述文本字段在x轴上的位置。和以前一样,我们将使用画布右下角的弹出按钮来定义约束:

    1. 点击添加新约束按钮(对齐按钮右侧的按钮)。
    2. 在弹出窗口顶部的图表上,单击白色矩形左侧和右侧的淡红色线条。这告诉Interface Builder我们想要添加前导和尾随约束。
    3. 现在,在文本字段的每一侧输入所需的填充。在示例图片中,我在两侧都带有“4”点,但显然,您可以使用您认为最适合您布局的任何值。
    4. 最后,点击“添加2个约束”按钮。
    5. Adding horizontal constraints to a view in Interface Builder

      现在出现的任何警告都应该消失,因为我们已经添加了足够的约束来描述文本字段的位置。理论上,您现在应该能够构建和运行项目,并且文本字段应该与显示三角形对齐。有了这个说法,布局可能会有很多其他原因,并且考虑usesAutomaticRowHeights是macOS High Sierra中的一个新API(而且乔布斯已不再将其击败到Apple开发人员中,以使一切正常工作™),可能存在我不知道的问题。

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

      无论如何,尝试上面的步骤,看看他们是否为你做了什么,如果他们不这样做,请告诉我。我可以根据需要和你一起深入兔洞,所以请问。祝你好运!