美文网首页
UITableView的行高缓存

UITableView的行高缓存

作者: alige | 来源:发表于2017-04-02 10:46 被阅读84次

    当tableView的cell有图片时,如何来处理
    1,如果服务器能够返回图片的宽高
    那么在heightForRowAtIndexPath方法中进行行高的缓存,计算每个cell的高度,通过懒加载进行行高缓存。将行高存在一个数组中,如果拿出的数据为nil则重新计算行高。
    2,如果服务器不能够返回图片的宽高,只能返回图片的URL;

    • ① 此时应该先显示除图片之外的数据,然后使用SDWebImage进行图片的缓存(缓存的图片数组是服务器第一次返回的数组的所有图片数据,因此这些图片不能太大,否则用户体验会很差),并且要使用下载队列,下载完所有图片之后,通过设置模型数据数组,在其set方法中调用tableView.reloadData()方法重新刷新tableView的cell。
    • ② 重新刷新数据时,在其heightForRowAtIndexPath方法中进行行高的缓存,只计算一次行高,使用字典,以图片的url为key进行图片的size缓存。如果使用字典,应该注意当发生内存警告时,应该在第带ReceiveMemoryWarning方法中将字典的所有行高移除(NSCache的话,它会自动清理字典数据,就不需要自己处理了,但是它在模拟器上如果发生内存警告,一旦清除的话无法再次添加了,而真机上又可以,要注意这个坑)。
    • ③ 缓存行高,xib的cell底部是配图的view,那么在缓存行高的时候要先刷新下cell的数据模型(注意:这不是viewController的数据模型,不会造成tableview的刷新),更新配图(下载完成后才有图片),然后重新布局下这个cell。这样才能拿到正确的cell的高度
        // MARK: - 外部控制方法
        func calculateRowHeight(viewModel: StatusViewModel) -> CGFloat
        {
            // 1.设置数据
            self.viewModel = viewModel
            
            // 2.跟新UI
            self.layoutIfNeeded()
            
            // 3.返回底部视图最大的Y
            return CGRectGetMaxY(footerView.frame)
        }
    
    • ④ 微博配图有1,4,9张图片,若使用UICollectionView来进行布局,在自定义cell的模型数据setter方法中还要调整下collectionView的itemSize和collectionViewCell的宽度高度
    // 9.1更新cell的尺寸
    if itemSize != CGSizeZero
    {
             flowLayout.itemSize = itemSiz  
    }
    // 9.2跟新collectionView尺寸
    pictureCollectionViewHeightCons.constant = clvSize.height
    pictureCollectionViewWidthCons.constant = clvSize.width
    
     在图片没有下载完成时,图片size就为zero,一般tableView的cell都是用xib来做的,里面会添加约束,
    
    • PS:使用tabelView的预估行高estimateRowHeight可以提高性能;

    相关文章

      网友评论

          本文标题:UITableView的行高缓存

          本文链接:https://www.haomeiwen.com/subject/hxfgottx.html