- 背景:文本太多,文字显示不完整;tableView(或 collectionView)中嵌套tableView(或者 collectionView),由于区域固定,造成滑动里面有滑动,用户体验不好... 这些情况,可能需要实现cell的高度自定义。
一、带label的cell高度自定义:
tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension
- 注:
(1)上面的两行代码都必须写,不然会造成布局错乱;
(2)不用再重写 heightForRowAt 代理方法,否则,代理方法将覆盖上面的代码设置;
(3)必须设置 label.numberOfLines = 0 ;
(4)label 最好放在最外层的contentView上,否则,会至少保留label所在父视图的固定高度,即文字没有那么多时,仍然会留有最小高度;
二、tableView中嵌套scrollView的cell高度自定义:
方案:
(1)在tableView刷新前,计算好每个cell需要的高度,再赋值;
(2)在给scrollView赋值之后(刷新UI之后),获取scrollView.contentSize.height,即可获取这时候每个cell的高度,然后刷新tableView。方案评审:
(1)第一种方案计算太过于繁琐,并且有时候计算不一定准确;
(2)第二种方案简便,但是可能存在tableView中的scrollView还没有刷新好,就先获取到 scrollView.contentSize.height 的情况,造成刷新tableView之后,cell高度仍然不准确。这时候,需要tableView中的scrollView在reloadData之后,再获取 scrollView.contentSize.height 。
self.secondCell.collectionView.reloadData()
self.thirdCell.collectionView.reloadData()
//layoutIfNeeded():让刷新操作执行完之后才执行后续代码
self.secondCell.collectionView.layoutIfNeeded()
self.thirdCell.collectionView.layoutIfNeeded()
let secondCellHeight = self.secondCell.collectionView.contentSize.height + CGFloat(50)
let thirdCellHeight = self.thirdCell.collectionView.contentSize.height + CGFloat(80)
let newHeightArray = [CGFloat(60.0),secondCellHeight,thirdCellHeight,CGFloat(200.0)]
self.cellHeightArray = newHeightArray
self.tableView.reloadData()