iOS UITableView优化---计算/缓存行高

本文探讨了如何优化UITableView的性能,主要聚焦于计算和缓存行高的方法。通过在子线程预先计算每个Cell的行高并存储在内存中,避免在滑动时实时计算,从而提升滚动流畅性。对于动态行高的情况,推荐使用UITableView-FDTemplateLayoutCell开源库。同时,提供了基于图片、按钮和文本的Cell高度计算思路,以及处理固定和浮动高度Cell的策略。

        在滑动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)
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值