【问题标题】:NSOutlineView disclosure triangle vertically off centerNSOutlineView 显示三角形垂直偏离中心
【发布时间】:2018-05-08 21:53:47
【问题描述】:

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

我还在创建自定义 NSTableCellView 项目,而不是使用基本单元格项目。这让我可以按照自己的视觉方式创建单元格。

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

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

对于它的价值,我也将以下代码用于单元格。

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

【问题讨论】:

    标签: swift macos cocoa nsoutlineview


    【解决方案1】:

    如果不了解您是如何设置项目的,很难找出问题所在,但我会试一试。

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

    我会这样做:

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

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

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

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

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

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

    无论如何,请尝试上述步骤,看看他们是否为您做任何事情,如果他们没有,请告诉我。只要你需要,我可以和你一起深入兔子洞,所以问吧。祝你好运!

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 1970-01-01
      • 2015-02-04
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      相关资源
      最近更新 更多