美文网首页iOS开发知识小集程序员iOS大咖说
iOS 长按移动UICollectionView中Cell的位置

iOS 长按移动UICollectionView中Cell的位置

作者: 枫developer | 来源:发表于2018-05-05 23:36 被阅读130次

    在使用苹果手机的时候,大家可能会发现这样的一种操作效果:


    UICollectionView.gif

    就是在一个UICollectionView上,长按某一个cell,就能移动它,并且能够放在新的位置。这个方法就用到了UICollectionVIew的移动方法了,话不多说,直接上代码:

    #import "ViewController.h"
    #import "CollectionViewCell.h"
    #import "ImageModel.h"
    
    @interface ViewController () <UICollectionViewDataSource, UICollectionViewDelegate>
    
    /// collectionView
    @property (nonatomic, strong) UICollectionView *collectionView;
    /// 数据
    @property (nonatomic, strong) NSMutableArray<ImageModel *> *imageModels;
    /// 是否移动
    @property (nonatomic, assign) BOOL isBeganMove;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        //获取数据
        [self getDatas];
        
        //注册cell
        [self.collectionView registerClass:[CollectionViewCell class] forCellWithReuseIdentifier:@"CollectionViewCell"];
        
        [self.collectionView reloadData];
    }
    
    /// 创建假数据
    -(void)getDatas {
        self.imageModels = [NSMutableArray array];
        
        for (int index = 0; index < 10; index ++) {
            ImageModel *model = [[ImageModel alloc] init];
            model.imageName = [NSString stringWithFormat:@"image%d", index];
            
            [self.imageModels addObject:model];
        }
    }
    
    #pragma mark - 手势事件
    -(void)moveCollectionViewCell:(UILongPressGestureRecognizer *)gesture {
        switch (gesture.state) {
            case UIGestureRecognizerStateBegan: {
                if (!self.isBeganMove) {
                    self.isBeganMove = YES;
                    //获取点击的cell的indexPath
                    NSIndexPath *selectedIndexPath = [self.collectionView indexPathForItemAtPoint:[gesture locationInView:self.collectionView]];
                    
                    //开始移动对应的cell
                    [self.collectionView beginInteractiveMovementForItemAtIndexPath:selectedIndexPath];
                }
                break;
            }
            case UIGestureRecognizerStateChanged: {
                //移动cell
                [self.collectionView updateInteractiveMovementTargetPosition:[gesture locationInView:self.collectionView]];
                break;
            }
            case UIGestureRecognizerStateEnded: {
                self.isBeganMove = false;
                //结束移动
                [self.collectionView endInteractiveMovement];
                break;
            }
            default:
                [self.collectionView cancelInteractiveMovement];
                break;
        }
    }
    
    #pragma mark - UICollectionViewDataSource/UICollectionViewDelegate
    -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
        return self.imageModels.count;
    }
    
    -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
        CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CollectionViewCell" forIndexPath:indexPath];
        
        cell.imageView.image = [UIImage imageNamed:self.imageModels[indexPath.row].imageName];
        
        //添加长按手势
        UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(moveCollectionViewCell:)];
        [cell addGestureRecognizer:longPress];
        
        return cell;
    }
    
    -(void)collectionView:(UICollectionView *)collectionView moveItemAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath {
        //处理数据(删除之前的位置数据,插入到新的位置)
        ImageModel *selectModel = self.imageModels[sourceIndexPath.item];
        [self.imageModels removeObjectAtIndex:sourceIndexPath.item];
        [self.imageModels insertObject:selectModel atIndex:destinationIndexPath.item];
    
        //此处可以根据需要,上传给后台目前数据的顺序
    }
    
    #pragma mark - 懒加载
    -(UICollectionView *)collectionView {
        if (!_collectionView) {
            UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
            layout.minimumInteritemSpacing = 10;
            layout.minimumLineSpacing = 10;
            layout.sectionInset = UIEdgeInsetsMake(10, 10, 10, 10);
            layout.itemSize = CGSizeMake([UIScreen mainScreen].bounds.size.width / 2.f - 20.f, [UIScreen mainScreen].bounds.size.width / 2.f - 20.f);
            
            _collectionView = [[UICollectionView alloc] initWithFrame:self.view.frame collectionViewLayout:layout];
            _collectionView.delegate = self;
            _collectionView.dataSource = self;
            _collectionView.backgroundColor = [UIColor whiteColor];
            [self.view addSubview:_collectionView];
        }
        
        return _collectionView;
    }
    
    @end
    

    这些代码其实说的很明白了。大家发现,其实在移动的过程中,相当不停的调用UICollectionView的移动cell的方法,并且不停地变化着数据数组的顺序。这样就可以保证在改变cell的位置的同时,也改变了数据的顺序。

    看到代码之后,大家就会发现,这个需求简直太容易了,喜欢的话就点个赞吧。

    相关文章

      网友评论

      本文标题:iOS 长按移动UICollectionView中Cell的位置

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