【发布时间】:2024-01-05 23:42:02
【问题描述】:
我很高兴能够直接在 Xcode 中构建我的静态 TableViews,使用自动布局来支持动态类型,正如 WWDC2014 What's New in Table and Collection Views 中提到的那样。
我更喜欢严格使用 Xcode/Interface Builder 和故事板来处理自动布局。当我这样做时,不知何故 TableView 单元格没有调整大小,我确定我错过了一些简单的东西。
为了重现这一点,使用 Xcode 7 beta 5,我:
- 创建了一个新的单视图项目。
- 将 Storyboard 入口点设置为新的 UITableViewController。
- 使其成为具有分组样式的静态表格视图。
- 在第一行添加了一个标签。为顶部、底部、左侧和右侧添加了约束。
- 将标签字体设置为“正文”。
-
添加到 ViewDidLoad:
self.tableView.rowHeight = UITableViewAutomaticDimension; self.tableView.estimatedRowHeight = 44.0;
运行它并在设置中调整动态类型。虽然字体发生变化,但 TableView 高度仍停留在明显的默认值 44 并截断标签。
这是一个GitHub repository,它是上述结果。
为什么自动布局不会导致 TableView 扩展以填充必要的空间以适应新的更大的标签文本?
我发现了有关该主题的精彩帖子,例如以下内容,并热衷于使用代码设置约束here。
我没有在纯 Interface Builder 中找到任何这样做的示例。确定这是完全可能的吗?
更新
我已更新 GitHub 源代码以包含第二个表格行,其中包含 ImageView 而不是 UILabel;它显示了同样的问题:
此外,当我在标签或图像视图上设置显式高度约束时,我会生成以下内容。问题似乎是我没有设置的“UIView-Encapsulated-Layout-Height”约束。我猜它的生成是因为在 IB 的静态表格视图中,行高设置(默认)为 44。
Unable to simultaneously satisfy constraints.
...
"<NSLayoutConstraint:0x7fa371f39e30 V:[UILabel:0x7fa371f38d30'Label'(20)]>",
"<NSLayoutConstraint:0x7fa371c39160 UILabel:0x7fa371f38d30'Label'.top == UITableViewCellContentView:0x7fa371e17dc0.topMargin>",
"<NSLayoutConstraint:0x7fa371c393c0 UITableViewCellContentView:0x7fa371e17dc0.bottomMargin == UILabel:0x7fa371f38d30'Label'.bottom>",
"<NSLayoutConstraint:0x7fa371f41a40 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7fa371e17dc0(43.5)]>"
但是 ViewDidLoad 中的 this 不应该覆盖 this 吗?
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 44.0;
自动调整大小的表格视图单元格是否根本不适用于静态表格视图?
更新 2
我使用动态原型而不是静态表格视图构建了相同的东西,并且一切正常:
它确实似乎是静态与动态原型表。静态表格视图单元格未正确展开。
我没有看到 WWDC 视频中提到动态与静态,所以在这一点上,我将其归结为一个错误。如果我学到任何新东西会更新。
我更新了上面的 GitHub 存储库,以显示静态(损坏)和动态(工作)表视图的示例。
【问题讨论】:
-
有一个answer。
标签: ios xcode uitableview ios8 autolayout