带有Interface Builder的iOS8自动调整静态TableView单元格

我很兴奋能够在Xcode中使用自动布局来支持dynamictypes的静态TableViews,如WWDC2014“表和集合视图中的新增function”中所述

我宁愿严格使用Xcode / Interface Builder和故事板来处理自动布局。 当我这样做,不知何故TableView单元格不会resize,我敢肯定,我错过了一些简单的东西。

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

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

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

  • 将其编辑并在“设置”中调整dynamictypes。 当字体改变时,TableView高度仍然停留在明显的默认值44,并截断标签。

在模拟器中截断标签

这是一个GitHub仓库 ,这是上述的结果。

为什么不是自动布局导致TableView展开,以填补必要的空间,以适应新的更大的标签文本?

我已经find了关于这个主题的很好的post,比如下面的代码, 在这里使用代码来设置约束。

我没有发现在纯粹的Interface Builder中这样做的任何例子。 这当然很有可能吗?

更新

我已经更新了GitHub源代码,包括一个ImageView而不是UILabel的第二个表格行; 它显示了同样的问题:

更新了截图

此外,当我在标签或图像视图上设置明确的高度约束时,我生成以下内容。 这个问题似乎是这个“UIView-Encapsulated-Layout-Height”约束,我没有设置。 我猜这是生成的,因为在IB的静态tableview中,行高设置(默认)为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中重写这个吗?

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

做自我大小的表视图单元格不工作与静态表视图?

更新2

我使用dynamic原型而不是静态表视图来构build相同的东西,并且所有工作都很好:

在这里输入图像说明

它确实似乎是静态与dynamic原型表。 静态表格视图单元格不能正确展开。

我在WWDCvideo中没有看到dynamic与静态的关系,所以在这一点上,我将这个问题归结为一个bug。 如果我学到新东西,会更新。

我已经更新了上面的GitHub仓库,以显示静态(破损)和dynamic(工作)表视图的一个例子。

回答:

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

  1. 创build新的单视图应用程序
  2. 新文件。 Cocoa类“MyStaticTableViewController”,UITableViewController的子类。
  3. 在Storyboard中,拖入新的Table View Controller。
  4. 将类更改为MyStaticTableViewController。
  5. 将故事板入口点拖到新的VC。
  6. 删除原始的VC。
  7. 将类更改为MyStaticTableViewController以获取新的VC。
  8. select表格视图。 将内容更改为静态单元格和样式以进行分组。
  9. 将新标签拖到第一个表格视图单元格。 将字体更改为正文。 将顶部,底部,左侧,右侧约束设置为0并更新帧。
  10. 在MyStaticTableViewController.m中,添加:
  - (void)viewDidLoad { [super viewDidLoad]; self.tableView.rowHeight = UITableViewAutomaticDimension; self.tableView.estimatedRowHeight = 44.0; } 
  1. 使用dynamictypes进行validation,增加大小会导致表格行也展开。

由Xcode 6.4创build的项目按预期工作 – 表视图单元格展开以适应标签。

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

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

更新

我将.storyboard文件相互比较,并在tableView条目下的破解的Xcode7b5文件中,有一个矩形定义:

 <rect key="frame" x="0.0" y="0.0" width="600" height="600"/> 

我删除了这一行,似乎表格视图单元格现在正确地自我大小!

更新2

关键问题似乎是在XML文件的每个“tableViewCell”条目下留下的“rect”条目。 打这些是什么修复这个问题。

更新3

归档的雷达:

“工程部门已经确定你的错误报告(22311571)是另一个问题(17995201)的重复,将被closures。

我没有时间看代码,但我几乎可以肯定问题是标签。 字体大小改变,但标签的大小不变。 我怀疑这是因为在占据整行后文本没有被截断,而是留下一点空白。

做一个快速testing:把一个彩色背景放到文本标签上。 我敢打赌,你会注意到它没有增长。 如果没有,请看这里: 根据文本调整UILabel的高度

对于静态表格视图单元格,您不能在ViewDidLoad中使用UITableViewAutomaticDimension。 相反,使用覆盖函数heightForRowAt。 我的viewDidLoad里面什么也没有。 我在ViewDidLoad上面添加了这两个覆盖函数。

//第一个覆盖每一行的高度,以便自动resize。

 override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension } 

//这将在resize之前估计行的高度

  override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return 100 } 

只要你有顶部,底部,左侧和右侧的布局约束,一切都应该resize。