UITableViewAutomaticDimension在iOS 8上无法正常工作

8
我正在跟随这个教程制作自适应大小的单元格。
我将自定义单元格注册到表视图中,在单元格xib中手动给每个子视图添加了约束。请参考GitHub中的源代码 在iOS 9中,将3个标签垂直排列在一个单元格的内容视图中运作良好,但在iOS 8中不行(在设备和模拟器中都测试过)。
在iOS 8中,一个单元格没有合适的高度,也没有每个标签显示完整的文本。
iOS 8不适配:

enter image description here

enter image description here

任何建议都将不胜感激!
更新 viewDidLoad 中的代码:
 tableView.registerNib(UINib.init(nibName: "SelfSizingCell", bundle: nil), forCellReuseIdentifier: cellIdentifier)
 tableView.dataSource = self
 tableView.delegate = self
 tableView.estimatedRowHeight = 60.0
 tableView.rowHeight = UITableViewAutomaticDimension
 tableView.reloadData()

@robmayoff 是的,我测试了我的代码在iOS 8和iOS 9上,并没有发现任何差异。请检查上面的GitHub链接。 - bluenowhere
我必须为iOS8设置上面两个标签的特定高度约束,以使高度自动化工作,或者简单地在一个单元格中不超过2个标签。正在寻找更好的方法... - bluenowhere
@bluenowhere 你解决了这个问题吗?我也想知道解决方案。如果你知道,请发布一个答案。我正在以编程方式开发所有内容。 - mythicalcoder
1
@Maven 下面被接受的答案下方的评论对我有用。 - bluenowhere
你必须相对于单元格容器视图设置所有左、右、下和上的约束。 - Hardik Darji
显示剩余2条评论
6个回答

16
在返回单元格之前,在“cellForRowAtIndexPath”方法中添加以下代码。
    cell.setNeedsUpdateConstraints()
    cell.updateConstraintsIfNeeded()

这是什么原因导致了这个问题? - bluenowhere
即使只有cell.updateConstraintsIfNeeded()也可以工作... - jayant rawat

6
为了使其在iOS 8上运行,您需要三个步骤:
1)在视图加载方法中设置表格的“估计行高”。
tableView.estimatedRowHeight = 200.0

2) 实现"table view height for cell at..."方法。(如果您的类不是UITableViewController的子类并且您正在自己添加表格视图,请删除'override'。)

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

3) 在 'table view cell for row at...' 方法中返回单元格时,调用 'updateConstraintsIfNeeded' 方法。

cell.updateConstraintsIfNeeded()

return cell

注意:对于iOS 9及以上版本,不需要进行第三步操作。


4

给使用的UILabel设置Top,Bottom,Leading和Trailing约束。

检查numberOfLine必须为0。

然后设置以下方法:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewAutomaticDimension;}

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewAutomaticDimension;}

现在运行该项目 :)

那是什么原因?谢谢。 - Ricardo
对于 Xamarin 使用:使用 GetHeightForRow 返回 UITableView.AutomaticDimension,使用 EstimatedHeight 返回 UITableView.AutomaticDimension。 - eL-Prova

3

版本 10.1

UITableViewAutomaticDimension 改名为 UITableView.automaticDimension。


2
这两行代码对我很有帮助:
tableView.estimatedRowHeight = 200.0
tableView.rowHeight = UITableViewAutomaticDimension

其他答案中我尝试的所有方法都没有奏效。


1

我无法让它工作... 我检查了这个线程中的所有提示,但是表视图单元格不会调整其高度。

我设置了相同的自定义表视图单元格原型单元格在Storyboard中,并且它可以工作。
出于可重用性的考虑,我将单元格设置为xib。表视图加载,但单元格不再调整大小。似乎故事板可以工作,但是xib表视图单元格不能。
每个电视单元格内都有一个UICollection视图,其中包含不同数量的cv单元格,因此每个电视单元格的高度不能相同。

我没有更改任何函数调用,例如在多个位置调用self.tableview.beginUpdates()和.endUpdates()。 我使用Xcode 8.3.2


问题已解决。问题在于我为电视单元格的标题视图设置了固定高度...似乎所有与电视单元格内容视图直接有约束的视图元素都不能有任何固定高度约束。这对于电视单元格中的集合视图来说很简单,但我认为对于标题视图来说并不那么简单... 对于集合视图非常重要:self.collectionView.translatesAutoresizingMaskIntoConstraints = true。 - domi852
由于电视单元格中的集合视图已关闭滚动,因此我创建了此扩展程序,以便在每次电视单元格布局其子视图时更新其高度:extension UICollectionView {func updateHeight() { let updatedHeight = self.collectionViewLayout.collectionViewContentSize.height if updatedHeight != self.frame.size.height { let frame = CGRect(x: self.frame.origin.x, y: self.frame.origin.y, width: self.frame.size.width, height: updatedHeight) self.frame = frame } } } - domi852

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接