当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可以提高性能;
网友评论