【问题标题】:How to update row heights of NSTableView with usesAutomaticRowHeights = true after column resize?如何在列调整大小后使用 usesAutomaticRowHeights = true 更新 NSTableView 的行高?
【发布时间】:2018-04-04 01:09:02
【问题描述】:

从 macOS 10.13 开始,我们可以使用具有自动行高的 NSTableView,这要归功于新属性 usesAutomaticRowHeights,当然还有自动布局。这很好用。

但是当用户调整列的大小时,计算出的高度不再正确,并且表格视图单元格中会出现间隙。

在这种情况下,是否有一种行之有效的方法可以在调整列大小后更新行高?

我已经尝试过updateConstraintsForSubtreeIfNeeded()updateConstraints()setNeedsDisplay()reloadData() 等方法,但没有任何效果。

【问题讨论】:

    标签: macos autolayout nstableview


    【解决方案1】:

    如果您在设计中使用 NSTextField,请确保每个具有动态高度的 NSTextField 的 Desired Width 设置设置为 Automatic。此设置位于尺寸检查器中。

    更改此设置会导致自动重新计算 tableview 行高。

    【讨论】:

      【解决方案2】:

      对我有用的是在 NSTableviewDelegate 中包含tableViewColumnDidResize 通知方法。在那里你可以调用表格视图的noteHeightOfRows 方法。这是一个实现:

         //Recalculate when the screen moves
         func tableViewColumnDidResize(_ notification: Notification) {
           let allIndex = IndexSet(integersIn:0..<self.YOURTABLE.numberOfRows)
          YOURTABLE.noteHeightOfRows(withIndexesChanged: allIndex)
      }
      

      这里是文档的链接:tableViewColumnDidResizenoteHeightOfRows

      【讨论】:

      • 谢谢,但不幸的是,这在我的代码中不起作用。你用usesAutomaticRowHeights = true吗?
      • 我已通过 Interface Builder 将 Row Size 样式设置为“Automatic(自动布局)”。当你说它不起作用时,你的意思是它没有被调用还是被调用时它什么也不做?
      • 它确实被调用了,但行的高度保持不变。我所有其他尝试也在同一个 tableViewColumnDidResize 委托中。您是否还实现了heightOfRow 委托?如果为真,当您删除此委托时您的代码是否仍然有效?
      • 是的,我也实现了HeightOfRow,如果我删除它就不起作用。我在那里做的是创建和配置视图并调用layoutSubtreeIfNeeded。之后,我返回视图的高度。
      • @Ely 我能够在没有heightOfRow tableViewColumnDidResize 的情况下使其工作,我遵循 [developer.apple.com/library/content/releasenotes/AppKit/… 并确保布局约束、拥抱和压缩是足够的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-19
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      相关资源
      最近更新 更多