【问题标题】:Automatically adjust width of a view based NSTableView based on content根据内容自动调整基于视图的 NSTableView 的宽度
【发布时间】:2016-02-26 17:10:49
【问题描述】:

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

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

上一个问题已经回答了,但只与NSTableView的高度有关。我想知道如何对宽度做“相同”。我想使用自动布局尽可能多地实现该解决方案。

我尝试将参与 NSWindow 最终显示的每个视图元素的水平“内容拥抱优先级”和“内容压缩阻力优先级”设置为最大值 1000。我在想 NSTextField 的内在内容大小会强制所有其他元素进行调整,但它不起作用。

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

这里是一个示例项目的链接来演示这个问题:

sample project

任何帮助将不胜感激!

【问题讨论】:

    标签: swift cocoa autolayout nstableview nswindow


    【解决方案1】:

    我使用此代码修复了问题,其中 scrollViewWidthConstraint 是 NSScrollView 宽度约束的 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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-15
      • 2023-04-03
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      • 2013-09-08
      • 2014-03-05
      • 1970-01-01
      相关资源
      最近更新 更多