美文网首页
iOS CollectionView 列表与网格布局之间切换(带

iOS CollectionView 列表与网格布局之间切换(带

作者: OrrHsiao | 来源:发表于2020-11-12 15:01 被阅读0次

    话不多说,直接上代码,自定义cell的代码就不贴了,很简单的放了个Label,这样的写法在动态切换时存在一个问题,cell内部的label的动画无法展示,处理办法是在设置isList时,通知cell内部进行动画

    //
    //  ViewController.m
    //  XACollectionAnimationChangeProject
    //
    //  Created by wj on 2019/9/10.
    //  Copyright © 2019年 XA. All rights reserved.
    //
    
    #import "ViewController.h"
    #import "XAGridCollectionViewCell.h"
    
    #define XAWidth [UIScreen mainScreen].bounds.size.width
    #define XAHeight [UIScreen mainScreen].bounds.size.height
    
    @interface ViewController ()<UICollectionViewDelegate,UICollectionViewDataSource>
    
    @property (nonatomic , retain)UICollectionView *collectionView;
    
    /**
     多行多列式布局
     */
    @property (nonatomic , retain)UICollectionViewFlowLayout *gridLayout;
    
    /**
     多行一列式布局
     */
    @property (nonatomic , retain)UICollectionViewFlowLayout *listLayout;
    
    @property (nonatomic , assign)BOOL isList;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        [self.view addSubview:self.collectionView];
        self.collectionView.frame = CGRectMake(0, 0, XAWidth, XAHeight);
    }
    
    #pragma mark
    - (UICollectionViewFlowLayout *)listLayout {
        if (!_listLayout) {
            _listLayout = [[UICollectionViewFlowLayout alloc] init];
            _listLayout.itemSize = CGSizeMake(XAWidth, 200);
            _listLayout.minimumLineSpacing = 5;
            _listLayout.sectionInset = UIEdgeInsetsZero;
        }
        return _listLayout;
    }
    
    - (UICollectionViewFlowLayout *)gridLayout {
        if (!_gridLayout) {
            _gridLayout = [[UICollectionViewFlowLayout alloc] init];
            CGFloat itemWidth = (self.view.frame.size.width - 5) * 0.5;
            _gridLayout.itemSize = CGSizeMake(itemWidth, 300);
            _gridLayout.minimumLineSpacing = 5;
            _gridLayout.minimumInteritemSpacing = 5;
            _gridLayout.sectionInset =  UIEdgeInsetsZero;
        }
        return _gridLayout;
    }
    
    - (UICollectionView *)collectionView {
        if (!_collectionView) {
            _collectionView = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:self.gridLayout];
            [_collectionView registerClass:[XAGridCollectionViewCell class] forCellWithReuseIdentifier:@"cell1"];
            _collectionView.backgroundColor = [UIColor grayColor];
            _collectionView.delegate = self;
            _collectionView.dataSource = self;
            if (@available(iOS 11.0, *)) {
                _collectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
            }else {
                self.automaticallyAdjustsScrollViewInsets = NO;
            }
        }
        return _collectionView;
    }
    
    - (void)setIsList:(BOOL)isList {
        _isList = isList;
        if (isList) {
            [self.collectionView setCollectionViewLayout:self.listLayout animated:YES];
        }else{
            [self.collectionView setCollectionViewLayout:self.gridLayout animated:YES];
        }
        [self.collectionView reloadData];
    }
    
    - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
        self.isList = !self.isList;
    }
    
    - (nonnull __kindof UICollectionViewCell *)collectionView:(nonnull UICollectionView *)collectionView cellForItemAtIndexPath:(nonnull NSIndexPath *)indexPath {
        XAGridCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell1" forIndexPath:indexPath];
        return cell;
    }
    
    - (NSInteger)collectionView:(nonnull UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
        return 12;
    }
    
    //定义每一个cell的大小
    
    - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
        return ((UICollectionViewFlowLayout *)collectionViewLayout).itemSize;
    }
    
    @end
    
    

    相关文章

      网友评论

          本文标题:iOS CollectionView 列表与网格布局之间切换(带

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