我有一个带有几个UITableView控制器的应用程序。在iOS 8.x上运行,每个表中所有单元格的高度将调整大小以适合单元格的内容(所有单元格都只包含带有纯文本的UILabel)。现在,当在iOS 9上运行时,每个表上的每个单元格只有一行高。这适用于动态和静态表。我已经搜索了UIKit差异文档并进行了广泛的搜索,但我找不到合适的组合来获得除了所有表格中所有单元格中一行高度以外的任何内容。
答案 0 :(得分:11)
我遇到了类似的情况。诀窍似乎是通过UITableView
的委托方法明确地实现动态大小调整。即使故事板中的设置automatic
假设可以工作 - 但事实并非如此。解决方案是通过委托方法显式提供UITableViewAutomaticDimension
,然后像往常一样提供估计的单元格大小:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewAutomaticDimension;
}
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
/* Return an estimated height or calculate
* estimated height dynamically on information
* that makes sense in your case.
*/
return 200.0f;
}
如果有人确切知道为什么这在iOS 9中是必要的,以及它与iOS 8的区别,我很乐意听到它。
答案 1 :(得分:1)
我们可以使用iOS 8中的“UITableViewAutomaticDimension”通过使用以下两个属性来显式实现动态大小调整: -
tableView.estimatedRowHeight = 60.0
tableView.rowHeight = UITableViewAutomaticDimension
然后在返回单元格之前在“cellForRowAtIndexPath”方法中添加以下代码。
cell.setNeedsUpdateConstraints()
cell.updateConstraintsIfNeeded()
对于iOS 9,我们可以添加tableView的委托方法: -
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
答案 2 :(得分:0)
使用 layoutMargins
时,iOS 9-10上存在UIStackView问题。extension UIStackView {
open override func didMoveToSuperview() { // a workaround for stackview issues on iOS 9-10
super.didMoveToSuperview()
if #available(iOS 11.0, *) { } else {
layoutMargins = self.layoutMargins
}
}
}