我还没有尝试过使用新的 iOS 8 机制。但当我使用 iOS 6 / 7 执行此操作时,我遇到了类似的问题。将应用程序更新到 iOS 8 后,它仍然可以正常工作,所以也许旧方法仍然是最好的方法?
我这里有一些代码示例:AutoLayout 多行 UILabel 剪切一些文本 https://stackoverflow.com/questions/23398042/autolayout-multiline-uilabel-cutting-off-some-text
和这里:AutoLayout uitableviewcell 在横向和 iPad 上根据纵向 iPhone 计算高度 https://stackoverflow.com/questions/23496547/autolayout-uitableviewcell-in-landscape-and-on-ipad-calculating-height-based-on
长话短说,iOS 8 之前的方式涉及保留单元格的副本,只是为了计算内部的高度tableView:heightForRowAtIndexPath:
。但这还不足以处理多行UILabel
的。我必须子类化UILabel
更新preferredMaxLayoutWidth
每次layoutSubviews
被称为。
The preferredMaxLayoutWidth
“修复”似乎是我所缺少的神奇秘密。一旦我这样做了,我的大部分细胞就完美地工作了。
我的第二个问题只要求我正确设置内容压缩阻力和内容拥抱属性,因此例如告诉标签拥抱文本将意味着它不会扩展以填充空白,这将导致单元格收缩。
一旦我完成了这两件事,我的单元格现在可以处理任何字体大小或任何数量的文本,而无需任何混乱的布局代码。有很多东西需要学习,但我确实认为它最终得到了回报,因为我的应用程序中有很多动态内容。
Edit
在遇到我自己的 iOS 8 问题之后,我添加了更多细节来解决这些非常奇怪的 autoLayout 错误。
使用我提到的代码,当单元格“行高”未设置为自定义时,它似乎不起作用。通过选择单元格并单击“自动布局”选项卡(其中包含所有内容压缩阻力设置等),可以在 IB 中找到此设置。按下复选框,它将填充临时高度。
其次,在我的代码中,我保留了单元格的本地副本,然后在heightForRowAtIndexPath:
方法。这似乎每次调用时都会使单元格高度增加很多。我必须通过调用以下命令重新初始化本地副本:
localCopy = [self.tableView dequeueReusableCellWithIdentifier:@"mycell"];
看来新的 Xcode 6 / iOS 8 变化非常大,无法向后兼容 iOS 7,而且管理方式似乎也完全不同。
希望这可以帮助。
Edit 2
读完这个问题后:iOS AutoLayout 多行 UILabel https://stackoverflow.com/questions/17491376/ios-autolayout-multi-line-uilabel
我遇到了 iOS 7 / iOS 8 自动布局支持的另一个问题!我压倒一切layoutSubviews
对于 iOS 8 我还需要覆盖setBounds
更新preferredMaxLayoutWidth
呼叫超级后。 WTF苹果变了!
看来是IB中的设置有问题preferredMaxLayoutWidth
,因为iOS 7无法使用自动功能,如果你使用同样的UILabel
在多个设备上,它只会使用 1 宽度。所以UITableViewCell
iOS 8 平板电脑上的线会更大,因为同一个单元在 iOS 8 iPhone 上需要有 2 条线。