将单元格拖动到底部或顶部将停止并重新排序`collectionView`将不会重新排序

时间:2017-12-04 06:30:34

标签: ios uicollectionview

我向collectionView添加了一个longPress手势,并使用系统API来实现重新排序集合视图。这是我的代码:

CGPoint point = [sender locationInView:_collectionView];
NSIndexPath *indexPath = [_collectionView indexPathForItemAtPoint:point];
if (!indexPath) {
    return;
}
DragableCollectionViewCell *tempCell = (DragableCollectionViewCell *)[_collectionView cellForItemAtIndexPath:indexPath];

switch (sender.state) {
    case UIGestureRecognizerStateBegan: {

        AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

        [tempCell showDeletButton];
        [tempCell.deleteButton zkj_addEventHandler:^(id sender) {
            [tempCell hideDeleteButton];
            [self.dataSource[indexPath.section] removeObjectAtIndex:indexPath.item];
            [self.collectionView deleteItemsAtIndexPaths:@[indexPath]];
        } withControlEvents:UIControlEventTouchUpInside];

        [_collectionView beginInteractiveMovementForItemAtIndexPath:indexPath];
    }
        break;
    case UIGestureRecognizerStateChanged: {
        [_collectionView updateInteractiveMovementTargetPosition:point];
    }
        break;
    case UIGestureRecognizerStateEnded: {
        [_collectionView endInteractiveMovement];
    }
        break;

    default:
        [_collectionView cancelInteractiveMovement];
        break;
}

我正确地实现了collectionView的dataSource和委托。之后,它可以工作,我可以移动拖动单元格并重新排序collectionView。但是当我将单元格拖到底部或顶部时,单元格将停在底部或顶部,collectionView将不会自动重新排序。

2 个答案:

答案 0 :(得分:0)

iOS-11 中,

您可以在UICollectionView中使用拖放 API进行重新排序。 它比您的自定义实现更灵活,更易于实现。

请参阅以下链接,获取有关如何实现该方法的精彩教程:  https://medium.com/@p.gpt10/drag-it-drop-it-in-collection-table-ios-11-6bd28795b313

答案 1 :(得分:0)

确保您的手势识别器如果您使用UICollectionViewController,则应允许设置自定义手势识别器:self.installsStandardGestureForInteractiveMovement = false

另外,不要忘记实现委托的方法moveItemAtcanMoveItemAt

这是教程:http://nshint.io/blog/2015/07/16/uicollectionviews-now-have-easy-reordering/