美文网首页iOS - UICollectionView
修改layoutAttributesForElementsInR

修改layoutAttributesForElementsInR

作者: VitasLiu | 来源:发表于2017-01-30 17:01 被阅读0次

    场景描述: 在UICollectionViewFlowLayout的子类里重写layoutAttributesForElementsInRect方法, 为了实现不同的cell效果, 可以修改某组或某个Item的UICollectionViewLayoutAttributes.

    效果图如下:

    Paste_Image.png

    现在要修改第一组(中间组只有一个item)的item的size, 宽为屏幕的宽度, 高度为原来item高度的2倍

    在prepareLayout方法里设置好item的布局, 然后在layoutAttributesForElementsInRect方法里修改第1组Item的UICollectionViewLayoutAttributes属性

    代码如下:

    //此方法会计算并返回每个item的位置和大小,换句话说就是collectionView里面的布局是怎样布局的就根这个方法的返回值有关
    
    //此方法会先计算一定数量的数据,当你继续滚动需要一些新数据时会再次来计算新的数据
    //只要在这里有过返回的数据都会缓存起来,下次再滚回来不会再帮你计算新数据
    -(NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect{
        
        //获取原本的布局数据
        NSArray *arr = [super layoutAttributesForElementsInRect:rect];
    
        
    //    NSLog(@"ZFBFunctionListFlowLayout + layoutAttributesForElementsInRect");
        
        //循环遍历所有布局数据
        for (UICollectionViewLayoutAttributes *attr in arr) {
            
           
            if(attr.indexPath.section == 1){
                
                //如果是第1组,就把它的宽度放大
                CGRect frame = attr.frame;
                
                frame.size.width = self.collectionView.bounds.size.width;
                frame.size.height = frame.size.height * 2;
                
                attr.frame = frame;
                
    //            break;//因为只需要改这一个,后面都不需要改,所以break结束这个循环
            }
            
            if (attr.indexPath.section == 2) {
                CGRect frame = attr.frame;
                
                frame.origin.y += frame.size.height;
    
                
                attr.frame = frame;
            }
            
        }
        
        return arr;
        
    }
    
    

    出现Warning:

    Logging only once for UICollectionViewFlowLayout cache mismatched frame

    This is likely occurring because the flow layout subclass ZFBFunctionListFlowLayout is modifying attributes returned by UICollectionViewFlowLayout without copying them

    大概意思是说我们自定义的布局对象正在修改由UICollectionViewFlowLayout返回的UICollectionViewLayoutAttributes属性, 而这个属性没有经过copy处理.

    解决方法:
    把原来的

    NSArray *arr = [super layoutAttributesForElementsInRect:rect];

    替换成

    NSArray *arr = [[NSArray alloc]initWithArray:[super layoutAttributesForElementsInRect:rect] copyItems:YES];

    这样就解决了:)

    相关文章

      网友评论

        本文标题:修改layoutAttributesForElementsInR

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