iOS8使用Interface Builder自行调整静态TableView单元格

Joh*_*art 10 xcode uitableview ios autolayout ios8

我很高兴能够在Xcode中构建我的静态TableView,使用自动布局来支持动态类型,如WWDC2014中提到的表和集合视图中的新功能.

我更喜欢严格使用Xcode/Interface Builder和故事板来处理自动布局.当我这样做时,不知何故TableView单元格没有调整大小,我确信我错过了一些简单的东西.

为了重现这一点,使用Xcode 7 beta 5,我:

  • 创建了一个新的单一视图项目.
  • 将Storyboard入口点设置为新的UITableViewController.
  • 使其成为具有分组样式的静态表视图.
  • 在第一行添加了一个标签.为顶部,底部,左侧和右侧添加了约束.
  • 将标签字体设置为"正文".
  • 添加到ViewDidLoad:

    self.tableView.rowHeight = UITableViewAutomaticDimension; self.tableView.estimatedRowHeight = 44.0;

  • 在设置中调整并调整动态类型.字体更改时,TableView高度仍然停留在明显的默认值44并截断标签.

模拟器中的截断标签

这是一个GitHub存储库,它是上面的结果.

为什么Auto Layout不会导致TableView扩展以填充必要的空间以适应新的更大标签文本?

我已经找到了关于这个主题的好帖子,如下所示,并且在这里一直在使用代码来设置约束.

我没有找到任何在纯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)]>"
Run Code Online (Sandbox Code Playgroud)

但是ViewDidLoad中的这个不应该超越这个吗?

self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 44.0;
Run Code Online (Sandbox Code Playgroud)

自行调整表格视图单元格是否不适用于静态表格视图?

更新2

我使用动态原型而不是静态表视图构建了相同的东西,一切正常:

在此输入图像描述

它确实似乎是静态的与动态原型表.静态表视图单元格未正确展开.

我在WWDC视频中没有看到动态与静态的关系,所以在这一点上我将这个问题搞砸了.如果我学到新东西,我会更新.

我已经更新了上面的GitHub存储库,以显示静态(损坏)和动态(工作)表视图的示例.

Joh*_*art 3

回答:

这是 Xcode7b5 中的一个错误。我刚刚通过遵循 Xcode 6.4 和 Xcode 7b5 中的相同步骤确认了这一点。

  1. 创建新的单一视图应用程序
  2. 新文件。Cocoa 类“MyStaticTableViewController”,UITableViewController 的子类。
  3. 在故事板中,拖入新的表视图控制器。
  4. 将类更改为 MyStaticTableViewController。
  5. 将故事板入口点拖到新的 VC 中。
  6. 删除原来的VC。
  7. 将新 VC 的类更改为 MyStaticTableViewController。
  8. 选择表视图。将内容更改为静态单元格,将样式更改为分组。
  9. 将新标签拖动到第一个表视图单元格。将字体更改为正文。将顶部、底部、左侧、右侧约束设置为 0 并更新帧。
  10. 在 MyStaticTableViewController.m 中添加:
 - (void)viewDidLoad {
    [super viewDidLoad];

    self.tableView.rowHeight = UITableViewAutomaticDimension;
    self.tableView.estimatedRowHeight = 44.0;

}
Run Code Online (Sandbox Code Playgroud)
  1. 使用动态类型验证增加大小是否也会导致表行扩展。

Xcode 6.4 创建的项目按预期工作 - 表视图单元格扩展以适合标签。

Xcode 7b5 创建的项目失败,如原始问题中所述。

有趣的是,如果用 Xcode7 打开 Xcode6 项目,它也可以正常工作。这与 Xcode7 创建项目或故事板的方式有关。

更新

我将 .storyboard 文件相互比较,在 tableView 条目下的损坏的 Xcode7b5 文件中,定义了一个矩形:

<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
Run Code Online (Sandbox Code Playgroud)

我删除了这一行,看起来表格视图单元格现在可以正确地自行调整大小了!

更新2

关键问题似乎是 XML 文件中每个“tableViewCell”条目下留下的“rect”条目。解决这些问题就可以解决这个问题。

更新3

场雷达:

“工程部门已确定您的错误报告 (22311571) 与另一个问题 (17995201) 重复,并将被关闭。”

  • 我的不起作用,直到我也覆盖 `tableView:heightForRowAtIndexPath:` 以返回 `UITableViewAutomaticDimension` (2认同)