iOS 自定义流布局 进阶篇

来源:互联网 发布:redis 数据库数量 编辑:程序博客网 时间:2024/04/30 06:43

在iOS开发流布局出来的界面很好看,但是要自定义各种各样的风格还是挺麻烦的 下面是我举了一个例子 做了一个 流布局 


#define WIDTH self.collectionView.frame.size.width


#import "JYLayout.h"


@interface JYLayout ()

//创建一个所有布局的数组

@property(nonatomic,strong)NSArray <UICollectionViewLayoutAttributes *>*attributeArr;

@end

@implementation JYLayout

//准备布局的时候调用

-(void)prepareLayout{

    [superprepareLayout];

    //最小列间距

    CGFloat minW =self.minimumInteritemSpacing;

    //最小行间距

    CGFloat minH =self.minimumLineSpacing;

    //看看一共有多少个

    NSInteger count=[self.collectionViewnumberOfItemsInSection:0];

    

    //cell的宽高

    CGFloat bigViewW = (WIDTH-minW)/2;

    CGFloat bigViewH = bigViewW;

    

    //cell的宽高

    CGFloat midViewW = (WIDTH-2*minW)/3;

    CGFloat midViewH = midViewW;

    

    //cell的宽高

    CGFloat smallViewW = (WIDTH -3*minW)/4;

    CGFloat smallViewH = smallViewW;

    

    //计算组高度

    CGFloat groupH=3*minH+bigViewH+midViewH+smallViewW;

    

    //创建一个临时可变数组暂时盛放布局

    NSMutableArray *arr=[[NSMutableArrayalloc]init];

    

    //循环创建布局

    for (int i=0; i<count; i++) {

        

        //看看是哪个组的  ps:一个组有2+3+4=9

        NSInteger group = i/9;

        //看看是组里的第几个

        NSInteger index=i%9;

        

        CGFloat W;

        CGFloat H;

        CGFloat X;

        CGFloat Y;

        switch (index) {

            case0:

                X=0;

                Y=minH+(groupH)*group;

                W=bigViewH;

                H=bigViewH;

                break;

            case1:

                X=WIDTH-bigViewW;

                Y=minH+(groupH)*group;

                W=bigViewH;

                H=bigViewH;

                break;

            case2:

                X=0;

                Y=minH+(groupH)*group+minH+bigViewH;

                W=midViewW;

                H=midViewH;

                break;

            case3:

                X=midViewW+minW;

                Y=minH+(groupH)*group+minH+bigViewH;

                W=midViewW;

                H=midViewH;

                break;

            case4:

                X=WIDTH-midViewW;

                Y=minH+(groupH)*group+minH+bigViewH;

                W=midViewW;

                H=midViewH;

                break;

            case5:

                X=0;

                Y=minH+(groupH)*group+minH+bigViewH+minH+midViewH;

                W=smallViewW;

                H=smallViewH;

                break;

            case6:

                X=minW+smallViewW;

                Y=minH+(groupH)*group+minH+bigViewH+minH+midViewH;

                W=smallViewW;

                H=smallViewH;

                break;

            case7:

                X=minW+smallViewW+minW+smallViewW;

                Y=minH+(groupH)*group+minH+bigViewH+minH+midViewH;

                W=smallViewW;

                H=smallViewH;

                break;

            case8:

                X=minW+smallViewW+minW+smallViewW+minW+smallViewW;

                Y=minH+(groupH)*group+minH+bigViewH+minH+midViewH;

                W=smallViewW;

                H=smallViewH;

                break;

                

            default:

                break;

        }

        //创建布局属性

        UICollectionViewLayoutAttributes *att = [UICollectionViewLayoutAttributeslayoutAttributesForCellWithIndexPath:[NSIndexPathindexPathForItem:iinSection:0]];

        att.frame =CGRectMake(X , Y , W, H);

        [arr addObject:att];

    }

    self.attributeArr = [arrcopy];

    //计算itemsize


    //如果不算高度的话 不能正好划到底部

    //计算一共的组数

    int totalGroupCount = (int)count /9;

    

    int yushu = count %9;

    

    CGFloat totalH;

  

    

    if (yushu ==0||yushu==8||yushu==7||yushu==6) {

        

        if (yushu==0) {

            totalH  =   totalGroupCount*groupH;

        }else{

            totalH  =   totalGroupCount*groupH+groupH;

        }

        

        

        

    }elseif (yushu ==5||yushu==4||yushu==3){


        

        totalH  =  totalGroupCount*groupH-minH-smallViewH+groupH;

        

    }else {

        totalH  =  totalGroupCount*groupH-minH-smallViewH-minH-midViewH+groupH;

    }

    

    

    self.itemSize =CGSizeMake(WIDTH, (totalH-count*minH)/(count-1));//这个高度很重要

}

- (nullableNSArray<__kindofUICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect

{

    

    returnself.attributeArr;

}

@end


调用只需要一行代码就好了

self.collectionView=[[UICollectionViewalloc]initWithFrame:self.view.framecollectionViewLayout:[JYLayoutnew]];

//下面是结果展示

//如果有什么不到之处,欢迎多多与我交流



0 0