根据内容自动调整基于NSTableView的视图宽度

时间:2016-02-26 17:10:50

标签: swift cocoa autolayout nstableview nswindow

标题应为:根据NSTableCellView的NSTextField内容固有内容大小自动调整基于NSTableView视图的包含NSWindow的宽度。

有点像this other question,我想实现一个自动完成的NSWindow,里面有一个NSTableView,它可以调整为在NSTableCellView中作为NSTextField实现的可用自动完成的长度宽度。显然,每个自动完成应显示在一行......

之前的问题已得到解答,但仅与NSTableView的高度相关。我想知道怎么做"相同"对于宽度。我想尽可能使用自动布局来实现解决方案。

我试图设置水平"内容拥抱优先级"和#34;内容压缩阻力优先"参与NSWindow最终展示的每个视图元素的最大值为1000。我当时认为NSTextField的内在内容大小会强制所有其他元素调整,但它不起作用。

设置NSTableColumn宽度不起作用,因为NSScrollView的NSClipView未被此宽度修改:NSScrollView调整并创建水平滚动条以覆盖整个"文档"。

以下是展示问题的示例项目的链接:

sample project

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

我使用此代码解决了问题,其中scrollViewWidthConstraint是NSOcrollView宽度约束的IBOutlet,localTableView是NSTableView的IBOutlet,tableColumn是NSTableColumn的IBOutlet(在我的情况下是唯一的)。

注意:GitHub上的链接项目已更新。

override func viewDidLoad() {

    super.viewDidLoad()

    self.updateTable()
}

func updateTable() {

    localTableView.reloadData()

    var computedWidth: CGFloat = 0

    for var row = 0; row < 10; row++  {

        let tableCellView = self.tableView(localTableView, viewForTableColumn: tableColumn, row: row) as! NSTableCellView

        computedWidth = max(computedWidth, tableCellView.textField!.intrinsicContentSize.width)
    }

    scrollViewWidthConstraint!.constant = computedWidth

    scrollView.needsUpdateConstraints = true
}