标签:Sizing heightMap tableView Self iOS cell UITableView
前言
在 iOS 11之后,UITableView默认开启了Self-Sizing。利用Self-Sizing技术,我们可以不需要实现heightForRowAt方法。但Self-Sizing可能会引起UITableView的闪烁问题,需要做一些优化处理。
我们知道:在 iOS 11之后,UITableView默认开启了Self-Sizing。利用Self-Sizing技术,我们不需要实现heightForRowAt方法,系统通过AutoLayout约束自动计算cell高度并绘制显示,这是一项非常不错的改进。但Self-Sizing可能会引起UITableView的闪烁问题,需要做一些优化处理。
开启Self-Sizing
iOS 10及之前版本需要配置:
tableView.estimatedRowHeight = 100.0 tableView.rowHeight = UITableView.automaticDimension
iOS 11之后仅需要配置:
tableView.rowHeight = UITableView.automaticDimension
在自定义的UITableViewCell中使用AutoLayout,不要实现heightForRowAt方法,即可使用UITableView的Self-Sizing。
同时,tableFooterView和tableHeaderView也是支持Self-Sizing的,不过需要通过systemLayoutSizeFitting的方法先获取其高度。
开启Self-Sizing 页面闪烁问题
当使用Self-Sizing滑动UITableView多次之后,执行reloadRows或reload很可能出现页面闪烁问题。
原因是即使使用了Self-Sizing技术,iOS系统还是要进行预估cell高度的操作,它会影响到滚动条的高度,如果提供的预估高度和实际cell的高度差别较大,就会带来闪烁问题。
一个比较好的改进方法是:
- 定义存储预估高度的map:
private var heightMap = [Int: CGFloat]()
- 增加实现estimatedHeightForRowAt和willDisplay的逻辑,分别获取和设置heightMap,即可解决UITableView闪烁问题。
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { if let value = heightMap[indexPath.row] { return value } else { return 100.0 } } func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { let key = indexPath.row if let _ = heightMap[key] { } else { heightMap[key] = cell.frame.size.height } }
标签:Sizing,heightMap,tableView,Self,iOS,cell,UITableView 来源: https://blog.51cto.com/u_15010671/2778080
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。