iOS UICollectionViewCell 的拖动
阅读原文时间:2023年07月12日阅读:1

1.长按cell的情况下实现拖动,所以理应想到用长按手势。

2.既然实现移动cell,就要看看UICollectionView 有没有方法或者协议可以移动的。通过查看UICollectionView的协议方法,可以在UICollectionViewDataSource中看到有两个方法。

- (BOOL)collectionView:(UICollectionView *)collectionView canMoveItemAtIndexPath:(NSIndexPath *)indexPath;

  • (void)collectionView:(UICollectionView *)collectionView moveItemAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath*)destinationIndexPath;

3.OK 知道了以上两个步骤,那么就可以开始写代码了。

// 设置手势

  • (void)setupGesture
    {
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handlelongGesture:)];

    [self.collectionView addGestureRecognizer:longPress];
    }

  • (void)handlelongGesture:(UILongPressGestureRecognizer *)longGesture {
    //判断手势状态
    switch (longGesture.state) {
    case UIGestureRecognizerStateBegan:
        {
    //判断手势落点位置是否在路径上
    NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint:[longGesture locationInView:self.collectionView]];
    if (indexPath == nil) {
    break;
    }
    //在路径上则开始移动该路径上的cell
    [self.collectionView beginInteractiveMovementForItemAtIndexPath:indexPath];
    }
    break;
    case UIGestureRecognizerStateChanged:
    //移动过程当中随时更新cell位置
    [self.collectionView updateInteractiveMovementTargetPosition:[longGesture locationInView:self.collectionView]];
    break;
    case UIGestureRecognizerStateEnded:
    //移动结束后关闭cell移动
    [self.collectionView endInteractiveMovement];
    break;
    default:
    [self.collectionView cancelInteractiveMovement];
    break;
    }
    }

  • (BOOL)collectionView:(UICollectionView *)collectionView canMoveItemAtIndexPath:(NSIndexPath *)indexPath{
    //返回YES允许其item移动
    return YES;
    }

  • (void)collectionView:(UICollectionView *)collectionView moveItemAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath*)destinationIndexPath {
    //取出源item数据
    id objc = [_dataSource objectAtIndex:sourceIndexPath.item];
    //从资源数组中移除该数据
    [_dataSource removeObject:objc];
    //将数据插入到资源数组中的目标位置上
    [_dataSource insertObject:objc atIndex:destinationIndexPath.item];
    }

注:_dataSource 是你的数据源。

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章