美文网首页iOSiOS bug修复iOS进阶指南
解决UICollectionView的Cell复用引起的布局混乱

解决UICollectionView的Cell复用引起的布局混乱

作者: 罗小耳 | 来源:发表于2016-04-13 10:40 被阅读10873次
之前遇到过好多解决TableView的重用问题,最近做了一下关于CollectionView的重用打标签的问题,发现CollectionView也会因为重用导致布局混乱的问题,具体场景如下图所示 问题复现.gif

查了一下度娘发现没有好的解决办法,于是发动自己的聪明才智,终于找到如下解决办法(充分证明了自己动手丰衣足食啊😄)

  1. 首先创建一个可变数组,用来存放Cell的唯一标示符
// 用来存放Cell的唯一标示符
@property (nonatomic, strong) NSMutableDictionary *cellDic;
#warning 别忘了初始化哟
    self.cellDic = [[NSMutableDictionary alloc] init];
  1. 在cellForItemAtIndexPath:这个方法中作相应的一些处理即可,代码如下
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    // 每次先从字典中根据IndexPath取出唯一标识符
    NSString *identifier = [_cellDic objectForKey:[NSString stringWithFormat:@"%@", indexPath]];
    // 如果取出的唯一标示符不存在,则初始化唯一标示符,并将其存入字典中,对应唯一标示符注册Cell
    if (identifier == nil) {
        identifier = [NSString stringWithFormat:@"%@%@", DayCell, [NSString stringWithFormat:@"%@", indexPath]];
        [_cellDic setValue:identifier forKey:[NSString stringWithFormat:@"%@", indexPath]];
        // 注册Cell
        [self.collectionView registerClass:[CalendarCollectionViewCell class]  forCellWithReuseIdentifier:identifier];
    }
    
    CalendarCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];

// 此处可以对Cell做你想做的操作了...
    
    return cell;
}

修改之后的效果图如下所示


修改之后的效果图.gif

本文纯属个人思路,如有更好的办法欢迎指导,一定虚心听取改正☺️

相关文章

网友评论

  • 铃鹿山大魔王:说好的重用引起布局混乱呢?你这个只能算是数据显示问题吧?数据源问题,而非布局问题。
  • DylanPP:取出复用cell 然后在setModel 里面UI绑定数据。
  • cyhai:这样做并不好
  • 遇见Miu:直接用模型装属性赋值就好了
  • 洁简:还是没解决问题..
    铃兰_900f:照着11楼的说法做就OK了
  • 布袋的世界:这样子很影响性能啊!
  • liuyan3176:简单的话直接用
    for (id subView in cell.contentView.subviews) {
    [subView removeFromSuperview];
    }

    就好了啊
    c43e7fe9996b:这样没用吧 试了一下 不行
    liuyan3176:@ParadiseMayCry 解决复用的办法就是自定义collectionCell?
    捡书:你这样做跟不复用没区别,都是重新alloc一个新的控件。对象的销毁与生成是最占用CPU的。
  • 9a78541e0250:这种情况是用数据源来解决的,比如某个格子的选中和未选中两种状态,这个属性可以放在model里,也可以放在数组中,当视图滑动的时候,根据取到的值来设置当前cell状态。
  • f170d29955a5:那注册cell的时候标识符那儿怎么处理?
    [_kidsNameCollectionView registerClass:[NoonCollectionViewCell class] forCellWithReuseIdentifier:@"ID"];这儿
  • HCYellow:写个自定义cell 然后写个数据的set方法 再里面改UI就好了
    问题不是出在重用 而是怎么处理重用
  • ROFL:DayCell指的是什么?看了你对上面的解释还是不太理解,能详细介绍下吗?万分感谢
  • 李国安:我没懂你什么意思! 这个选中状态要用数据模型来控制啊! 你这样做对于性能是一个很大的挑战!
  • keelZJP:cell的xib上的identifier要怎么处理
    楼下别说话:解决了没:joy:
    liujieyuu:尼解决了吗
  • 李潇南:楼主, 有问题!
    罗小耳:@李潇南 需要将lable被选中状态在字典中存一个属性做一个标记,每次给cell赋值lable的字体颜色时根据属性是yes还是no来赋值字体颜色
    李潇南:@伶罗愁簖 1.collectionView 2. cell上有一个label 3. 我点击cell的时候改变 label的字体颜色,然后选择其他IndexPath 颜色又回到以前状态,4, 我用你的方法 ,多滑动几次就又出现问题了。
    罗小耳:@李潇南 什么问题
  • 四五20:问题是解决了 但是不复用的话还是会占内存吧 这么怎么破?
    罗小耳:@24K纯金洋 之后会尽量完善:blush:
    罗小耳:@24K纯金洋 确实会有占用内存的问题,所以只适用于局部控件,不适合过大的控件
  • Who昵称:Daycell是什么?
    罗小耳:@Who昵称 为了区分唯一标识符,随便起的名字
  • 2407d92a20f5:那不就没有复用了
    罗小耳:@2407d92a20f5 就是没复用,复用会引起数据混乱

本文标题:解决UICollectionView的Cell复用引起的布局混乱

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