最近在做社区展示瀑布流,类似于小红书和大众点评首页列表页的展示。
以前使用到UICollectionView的地方并不多,这次使用它做了一个瀑布流的展示,一开始效果挺不错的,加了阴影边框,也不太耗内存。但是当我后期对接正式数据测试时,发现出现了很多重复的内容。开始debug。。。
1.因为此处数据是经过筛选和排序的,所以我一开始有怀疑过是后端数据问题。反复检查后确认后端无误,那只能是我的程序问题。
2.增加prepareForReuse,在该方法中将所有自定义的控件内容(图片、文字)置空,发现后面复用UICollectionViewCell 时,里面的内容都一片空白了。也就是说,一开始所谓的“重复数据”并不是真重复,而是复用了UICollectionViewCell,新的数据对应的cell没有更新。
3.我的cell更新是放在layoutSubviews中的,输出检查发现并非每次的cellForItemAtIndexPath后都会调用cell的layoutSubviews。遂在cellForItemAtIndexPath中调用[cell setNeedsLayout] 强制每次都系统自动调用layoutSubviews。问题果然得到了解决。
撸主是按照过往UITableView的经验来写的UICollectionView,但实际情况却是UICollectionView中cellForItemAtIndexPath并非每次都会刷新UICollectionViewCell。因为我发现并不是每次都不调用 ,所以就想找到原因。几番查找后发现自定义的UICollectionViewLayout中,计算cell高度的heightForItemAtIndexPath方法不像UITableView是每次对应cellForItemAtIndexPath进行调用,而是在一开始就集中式的调用了heightForItemAtIndexPath,导致最开始cell刷新了页面,而后续的更新并没有。所以我在cellForItemAtIndexPath中调用[cell setNeedsLayout] 使得cell每次显示时都强制做了更新,才解决了问题。
菜鸡总结:虽然UICollectionView与UITableView在使用的上来说有很多相似的地方,但实际的运行机制还是有所区别的,这个撸主还需要深入去了解一下。
网友评论