首页 > 解决方案 > 在 NSOutlineView 源列表中重新定位显示/隐藏按钮

问题描述

我正在使用 NSOutlineView 以编程方式创建源列表。一切都很好,除了组行上的显示/隐藏按钮位置太靠右:它们的右边缘与大纲视图的右边缘齐平,而不是像我使用时那样定位有一些边距一个笔尖。

在视图层次结构调试器中四处寻找,我可以看到在 NIB 的版本中, NSTableRowView 和按钮具有以下约束:tableRowView.width = button.maxX + 8 @ 1000. 在我的程序版本中,约束是tableRowView.width = button.maxX @ 1000. 在这两种情况下,约束都是由大纲视图或其子视图之一自动创建的。

有没有办法影响这个约束的创建,以便我得到我正在寻找的边距?

一个皱纹:我没有在 NSScrollView 中嵌入大纲视图。我不确定这是否有所作为。我这样做的原因有点令人费解:我试图从 Music.app 复制侧边栏,它有一个与侧边栏一起滚动的搜索字段。我的应用程序在 SwiftUI 中,因此我为大纲视图创建了一个 NSViewRepresentable,为 NSSearchField 创建了另一个,并将它们都包装在一个 SwiftUI ScrollView 中。我可以在不使用任何 SwiftUI 的情况下重现该问题。

我尝试了几件事:

这就是我所拥有的(程序化的)

我有的

这就是我想要的(来自NIB)

我想要的是

这是我覆盖时发生的情况frameOfOutlineCell(atRow:)

当我覆盖 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
}

标签: swiftcocoaappkitnsoutlineview

解决方案


推荐阅读