在滑动UITableView显示下一条Cell时, 总会执行tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat函数计算行高和
tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell函数得到布局。
列表优化其实就是优化这2个函数, 参考博客 TableView优化之高度缓存 。 原理是子线程中计算每行行高并缓存到内存, 然后tableView行数去行高时直接从内存中读取。
对于动态行高来说(即设置了UITableViewAutomaticDimension),我们不知道它到底需要多高。 有个开源的三方库可以实现计算行高功能:UITableView-FDTemplateLayoutCell 。
如果你的Cell布局并不复杂,建议自己实现计算行高功能。
思路:
1、 Cell大多由图片、按钮、文本组成的;
2、 我们能得到屏幕宽度, 并计算出UILable的高度;
3、Cell中的图片宽高可以在网络接口返回的json种携带过来, 如果按屏幕大小进行拉伸,也可以根据原始宽高等比缩放;
显示文本需要的行高:
extension String {
/**
* 查询lable高度
* @param fontSize, 字体大小
* @param width, lable宽度
*/
func getLableHeightByWidth(_ fontSize: CGFloat,
width: CGFloat,
font: UIFont) -> CGFloat {
let size = CGSize(width: width, height: CGFloat.greatestFiniteMagnitude)
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineBreakMode = .byWordWrapping
let attributes = [NSFontAttributeName:font,
NSParagraphStyleAttributeName:paragraphStyle.copy()]
let text = self as NSString
let rect = text.boundingRect(with: size, options:.usesLineFragmentOrigin, attributes: attributes, context:nil)
return rect.size.height
}
}
extension UILabel {
//根据最大宽度计算宽高
func getLableSize(text: String, maxWidth: CGFloat) -> CGRect {
let maxSize = CGSize(width: maxWidth, height: 0) //注意高度是0
// size = text.boundingRectWithSize(size2, options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: attributes , context: nil);
let size = text.boundingRect(with: maxSize, options: .usesLineFragmentOrigin,
attributes: [NSFontAttributeName:self.font], context: nil)
return size
}
}
如果列表有的Cell高度固定、有的Cell高度浮动, 那么可以改造获取行高函数,从而提高列表的性能。
原理:
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if 条件1 {
return 20.0
}
if 条件2 {
return 30.0
}
if 条件3 {
//从内存缓存中读取并返回
}
//其它情况
return super.tableView(tableView, heightForRowAt: indexPath)
}
本文探讨了如何优化UITableView的性能,主要聚焦于计算和缓存行高的方法。通过在子线程预先计算每个Cell的行高并存储在内存中,避免在滑动时实时计算,从而提升滚动流畅性。对于动态行高的情况,推荐使用UITableView-FDTemplateLayoutCell开源库。同时,提供了基于图片、按钮和文本的Cell高度计算思路,以及处理固定和浮动高度Cell的策略。
518

被折叠的 条评论
为什么被折叠?



