[英]iOS8 self-sizing static TableView cells with Interface Builder
我很高兴能够在Xcode中构建我的静态TableView,使用自动布局来支持动态类型,如WWDC2014中提到的表和集合视图中的新功能 。
我更喜欢严格使用Xcode / Interface Builder和故事板来处理自动布局。 当我这样做时,不知何故TableView单元格没有调整大小,我确信我错过了一些简单的东西。
为了重现这一点,使用Xcode 7 beta 5,我:
添加到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)]>"
但是ViewDidLoad中的这个不应该超越这个吗?
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 44.0;
自行调整表格视图单元格是否不适用于静态表格视图?
更新2
我使用动态原型而不是静态表视图构建了相同的东西,并且一切正常:
它确实似乎是静态的与动态原型表。 静态表视图单元格未正确展开。
我在WWDC视频中没有看到动态与静态的关系,所以在这一点上我将这个问题搞砸了。 如果我学到新东西,我会更新。
我已经更新了上面的GitHub存储库,以显示静态(损坏)和动态(工作)表视图的示例。
回答:
这是Xcode7b5中的一个错误。 我刚刚通过遵循Xcode 6.4和Xcode 7b5中的相同步骤确认了这一点。
- (void)viewDidLoad { [super viewDidLoad]; self.tableView.rowHeight = UITableViewAutomaticDimension; self.tableView.estimatedRowHeight = 44.0; }
由Xcode 6.4创建的项目按预期工作 - 表格视图单元格扩展以适合标签。
由Xcode 7b5创建的项目失败,如原始问题中所述。
有趣的是,如果使用Xcode7打开Xcode6项目,它也可以正常工作。 这与Xcode7如何创建项目或故事板有关。
更新
我将.storyboard文件相互比较,并在tableView条目下的破碎的Xcode7b5中,定义了一个rect:
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
我删除了这一行,似乎表视图单元格现在正确地自我调整大小!
更新2
关键问题似乎是XML文件中每个“tableViewCell”条目下面的“rect”条目。 重击那些是解决这个问题的方法。
更新3
提起雷达:
“Engineering已确定您的错误报告(22311571)与另一个问题(17995201)重复,并将被关闭。”
我没有时间查看代码,但我几乎可以肯定问题是标签。 字体大小会更改,但标签的大小不会更改。 我怀疑是因为文本在占据整行之后没有被截断,所以它留下了一小部分。
快速测试:在文本标签上添加彩色背景。 我敢打赌,你会注意到它没有增长。 如果没有,请看一下: 根据文字调整UILabel高度
对于静态表视图单元格,您不能在ViewDidLoad中使用UITableViewAutomaticDimension。 相反,使用override func heightForRowAt。 我的viewDidLoad中没有任何内容。 我在ViewDidLoad上面添加了这两个覆盖函数。
//第一个覆盖每行的高度,以便自动调整大小。
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
//这会在调整大小之前估计行的高度
override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return 100
}
只要您有顶部,底部,左侧和右侧布局约束,一切都应该调整大小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.