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

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



你可能感兴趣的:(iOS)