美文网首页工作生活
发布朋友圈-cell拖拽切换顺序

发布朋友圈-cell拖拽切换顺序

作者: 守护地中海的花 | 来源:发表于2019-07-02 17:44 被阅读0次

给cell长按手势 创建截图 然后拖拽截图和cell交互判断是否需要改变秩序

//移动所需参数
@property(nonatomic,strong)UIView *snapShotView;
@property(nonatomic,strong)NSIndexPath *moveIndexPath;
@property(nonatomic,strong)UICollectionViewCell *moveCell;

 这里最好cell的代理方法 返回手势
//长按手势
    UILongPressGestureRecognizer *longGes = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(gestureAction:)];
    //longGes.delegate = self;
    [cell addGestureRecognizer:longGes];

- (void)gestureAction:(UITapGestureRecognizer *)gestureRecognizer
{
    //记录上一次的手势的位置
    static CGPoint startPoint;
    //cell
    UICollectionViewCell *orignCell = (UICollectionViewCell *)gestureRecognizer.view;
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
        if ([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) {
            NSLog(@"开始-长按手势");
        }
        if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
            NSLog(@"开始-pan手势");
        }
        //获取截图
        self.snapShotView = [orignCell snapshotViewAfterScreenUpdates:YES];
        self.snapShotView.center = orignCell.center;
        [self.mainView addSubview:self.snapShotView];
        orignCell.hidden = YES;
        self.moveIndexPath = [self.mainView indexPathForCell:orignCell];
        self.moveCell = orignCell;
        startPoint = [gestureRecognizer locationInView:self.mainView];
        
    } else if (gestureRecognizer.state == UIGestureRecognizerStateChanged) {
        //NSLog(@"change");
        CGFloat tranX = [gestureRecognizer locationOfTouch:0 inView:self.mainView].x - startPoint.x;
        CGFloat tranY = [gestureRecognizer locationOfTouch:0 inView:self.mainView].y - startPoint.y;
        //设置截图位置
        self.snapShotView.center = CGPointApplyAffineTransform(self.snapShotView.center, CGAffineTransformMakeTranslation(tranX, tranY));
        startPoint = [gestureRecognizer locationOfTouch:0 inView:self.mainView];
        //计算交互
        for (UICollectionViewCell *itemCell in [self.mainView visibleCells]) {
            //跳过隐藏的cell 和固定cell 如添加cell
            if ([self.mainView indexPathForCell:itemCell] == self.moveIndexPath) {
                continue;
            }
            //计算中心距
            //powf/pow(double x, double y);计算以x为底数的y次幂
            //sqrt() / sqrtf() / sqrtl() ----求平方根
            CGFloat space = sqrtf(pow(self.snapShotView.center.x - itemCell.center.x, 2) + powf(self.snapShotView.center.y - itemCell.center.y, 2));
            //如果相交一半且两个视图Y的绝对值小于高度的一半就移动
            // fabs (double);求绝对值
            if (fabs(self.snapShotView.center.y - itemCell.center.y) <= self.snapShotView.height*0.5 && space <= self.snapShotView.bounds.size.width*0.5)
            {
                //将要移动到的位置
                NSIndexPath *endIndexPath = [self.mainView indexPathForCell:itemCell];
                //改变数据源
                //如果起始startCell滑动到后面endCell 把起始startCell值保存起来 然后把endCell前面和startCellz后面的cell 整体向前移动一位 包括endCell需要向前移动
                if (self.moveIndexPath.row < endIndexPath.row) {
                    //向后移动
                    //1.moveIndexPath之后 包括moveIndexPath 所有数据都获取下一个数据
                    //2.endIndexPath 截止 不包括endIndexPath
                    //3.endIndexPath 值是moveIndexPath原来的值
                    
                } else {
                    //向前移动
                    //1.endIndexPath 之后数据开始 不包括endIndexPath 那么起始位置就是endIndexPath的下一个 所有数据都是上一个数据
                    //2.moveIndexPath 截止 包括moveIndexPath
                    //3.endIndexPath 值是moveIndexPath原来的值
                }
                //UI改变
                [self.mainView moveItemAtIndexPath:self.moveIndexPath toIndexPath:endIndexPath];
                self.moveIndexPath = endIndexPath;
                break;
            }
        }
    } else if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {
        NSLog(@"结束");
        self.moveCell.hidden = NO;
        [self.snapShotView removeFromSuperview];
        self.snapShotView = nil;
    }
}

切换数据核心代码


if (self.moveIndexPath.row < endIndexPath.row) {
    //向后移动
    //1.moveIndexPath之后 包括moveIndexPath 所有数据都获取下一个数据
    //2.endIndexPath 截止 不包括endIndexPath
    //3.endIndexPath 值是moveIndexPath原来的值
    //PushPhotoItemModel *moveItemModel = self.dataSource[self.moveIndexPath.row];
    for (NSInteger index = self.moveIndexPath.row; index < endIndexPath.row; index ++) {
        [self.dataSource replaceObjectAtIndex:index withObject:self.dataSource[index + 1]];
    }
    //[self.dataSource replaceObjectAtIndex:endIndexPath.row withObject:moveItemModel];
    
} else {
    //向前移动
    //1.endIndexPath 之后数据开始 不包括endIndexPath 那么起始位置就是endIndexPath的下一个 所有数据都是上一个数据
    //2.moveIndexPath 截止 包括moveIndexPath
    //3.endIndexPath 值是moveIndexPath原来的值
    //PushPhotoItemModel *moveItemModel = self.dataSource[self.moveIndexPath.row];
    //这样数据就被改动了
    for (NSInteger index = (endIndexPath.row + 1); index <= self.moveIndexPath.row; index ++) {
        //[self.dataSource replaceObjectAtIndex:index withObject:self.dataSource[index - 1]];
    }
    for (NSInteger index = self.moveIndexPath.row; index > endIndexPath.row; index --) {
        [self.dataSource replaceObjectAtIndex:index withObject:self.dataSource[index - 1]];
    }
    //[self.dataSource replaceObjectAtIndex:endIndexPath.row withObject:moveItemModel];
}

相关文章

网友评论

    本文标题:发布朋友圈-cell拖拽切换顺序

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