2

当在 UITableViewCell 上使用启用了多行和自动换行的 UILabel 时,UITableView 可以毫无问题地处理不同的单元格高度。UILabel 根据其内容和宽度计算其高度。

我实现了一个自定义视图(https://github.com/fthdgn/ios-demo/blob/master/demo/CustomGridView.swift),它还根据其内容和宽度计算其高度。此视图是一个简单的网格视图,它根据可用宽度确定的列数确定行数和高度。但是,在 UITableViewCell 上使用自定义视图时会出现问题。

在我的演示应用程序(https://github.com/fthdgn/ios-demo)上,

  • 在第一个选项卡 [1st image] 上,单独使用自定义视图。它的高度是正确的。按钮添加新项目并正确更新其高度。
  • 在第二个选项卡 [2nd image] 上,自定义视图的高度计算错误。此高度是根据 XIB 文件上视图的占位符宽度计算的。该宽度小于正确宽度,因此高度大于正确值。
  • 第二个选项卡 [3rd image] 上的重新加载按钮,重新加载表格。自定义视图会正确计算和更新自身。
  • 在第 3 个选项卡 [第 4 张图像] 上,UILabel 从一开始就根据可用宽度计算其高度。

为什么我的自定义视图不像 UILabel 那样工作?是否缺少 setNeedsLayout、invalidateIntrinsicContentSize 调用?

选项卡1 TAB2 TAB2_RELOAD 选项卡3

我更新了代码以在 UITableView 上仅显示 1 行和 11 个单元格。XIB 文件上 Grid View 的宽度是 300,因为选择的设备是 4S。我用的模拟器是11 Pro Max,比4S宽。intrinsicContentSize 和 layoutSubviews 调用打印这些:

  • content (-1.0, 50.0) frame (300.0, 0.5)
    首先调用intrinsicContentSize。框架是 XIB 上的内容,约束尚未调整视图大小。这个宽度需要 50 高度来放置单元格。
  • layout(394.0, 50.333333333333336)
    调用layout,高度由intrinsicContentSize决定,宽度由UITableViewCell约束决定。它比intrinsicContentSize 计算的值更宽。
  • content (-1.0, 20.0) frame (394.0, 50.333333333333336)
    因为布局改变了,所以我使intrinsicContentSize无效。根据正确的宽度计算新的 intrinsicContentSize 值。新高度是20。
  • layout (394.0, 50.333333333333336)
    有些东西会触发布局。尽管最后一个 intrinsicContentSize.height 是 20,它仍然使用 50。
  • 内容 (-1.0, 20.0) 框架 (394.0, 50.333333333333336)
    布局使intrinsicContentSize 无效。intrinsicContentSize 会重新计算,但其值不会改变。

在这些调用之后,事件虽然最后一个 intrinsicContentSize 想要 20 高度,但框架仍然是 50。您可以在第二个屏幕截图中看到,具有 11 个单元格的行比它应该的长。

4

0 回答 0