swift - 在 NSOutlineView 源列表中重新定位显示/隐藏按钮
问题描述
我正在使用 NSOutlineView 以编程方式创建源列表。一切都很好,除了组行上的显示/隐藏按钮位置太靠右:它们的右边缘与大纲视图的右边缘齐平,而不是像我使用时那样定位有一些边距一个笔尖。
在视图层次结构调试器中四处寻找,我可以看到在 NIB 的版本中, NSTableRowView 和按钮具有以下约束:tableRowView.width = button.maxX + 8 @ 1000
. 在我的程序版本中,约束是tableRowView.width = button.maxX @ 1000
. 在这两种情况下,约束都是由大纲视图或其子视图之一自动创建的。
有没有办法影响这个约束的创建,以便我得到我正在寻找的边距?
一个皱纹:我没有在 NSScrollView 中嵌入大纲视图。我不确定这是否有所作为。我这样做的原因有点令人费解:我试图从 Music.app 复制侧边栏,它有一个与侧边栏一起滚动的搜索字段。我的应用程序在 SwiftUI 中,因此我为大纲视图创建了一个 NSViewRepresentable,为 NSSearchField 创建了另一个,并将它们都包装在一个 SwiftUI ScrollView 中。我可以在不使用任何 SwiftUI 的情况下重现该问题。
我尝试了几件事:
- 我覆盖
updateConstraints
了一个 NSTableRowView 子类,试图将约束的常量更新为 8,但是“显示/隐藏”按钮没有附加约束供我在updateConstraints
调用时修改。 - 我覆盖
frameOfOutlineCell(atRow:)
了 NSOutlineView 子类,但按钮没有移动。它只是被切断(图片如下)。
这就是我所拥有的(程序化的)
这就是我想要的(来自NIB)
这是我覆盖时发生的情况frameOfOutlineCell(atRow:)
这是创建大纲视图的代码:
func makeNSView(context: Context) -> NSOutlineView {
let outlineView = OutlineView()
outlineView.translatesAutoresizingMaskIntoConstraints = false
outlineView.selectionHighlightStyle = .sourceList
outlineView.rowSizeStyle = .default
outlineView.floatsGroupRows = false
outlineView.focusRingType = .none
let col = NSTableColumn(identifier: .init("Column 0"))
outlineView.addTableColumn(col)
outlineView.outlineTableColumn = col
outlineView.delegate = context.coordinator
outlineView.dataSource = context.coordinator
outlineView.expandItem(nil, expandChildren: true)
return outlineView
}
解决方案
推荐阅读
- php - 使用 get 方法中的输入元素更改项目的值
- c++ - Qt atomic int 获取并立即设置
- javascript - jquery如何触发点击事件?
- macos - macOS 中的 Maven 更新
- javascript - 当我使用 getElementsbyName 时,使用名称显示 id 演示不起作用
- java - 如何在 Android 上用您自己的替换 firebase 通知?
- linux - 在后台停止所有正在运行的软件/功能
- angular - 从角材料导入树组件
- github - 我有 2 个 git 分支开发和掌握,但错误地某些代码直接签入到掌握
- r - 带有ggplot和分组图例的情节子图?