- (void)setupDragCollectVieCell
{
// 开启拖放手势,设置代理。
self.collectionView.dragInteractionEnabled = YES;
self.collectionView.dragDelegate = self;
self.collectionView.dropDelegate = self;
}
- (NSArray<UIDragItem *> *)collectionView:(UICollectionView *)collectionView itemsForBeginningDragSession:(id<UIDragSession>)session atIndexPath:(NSIndexPath *)indexPath
{
GIRPhotoWallData *data = [self.photos objectAtIndex:indexPath.item];
NSItemProvider *itemProvider = [[NSItemProvider alloc] initWithObject:data.imageURL];
UIDragItem *dragItem = [[UIDragItem alloc] initWithItemProvider:itemProvider];
dragItem.localObject = data;
if (data.media == nil) {
return @[];
}
return @[dragItem];
}
// 是否接收拖动的item。
- (BOOL)collectionView:(UICollectionView *)collectionView canHandleDropSession:(id<UIDropSession>)session
{
return [session canLoadObjectsOfClass:[NSString class]];
}
// 拖动过程中不断反馈item位置。
- (UICollectionViewDropProposal *)collectionView:(UICollectionView *)collectionView dropSessionDidUpdate:(id<UIDropSession>)session withDestinationIndexPath:(NSIndexPath *)destinationIndexPath
{
UICollectionViewDropProposal *dropProposal;
if (session.localDragSession) {
// 拖动手势源自同一app。
dropProposal = [[UICollectionViewDropProposal alloc] initWithDropOperation:UIDropOperationMove intent:UICollectionViewDropIntentInsertAtDestinationIndexPath];
} else {
// 拖动手势源自其它app。
dropProposal = [[UICollectionViewDropProposal alloc] initWithDropOperation:UIDropOperationCopy intent:UICollectionViewDropIntentInsertAtDestinationIndexPath];
}
return dropProposal;
}
- (void)collectionView:(UICollectionView *)collectionView performDropWithCoordinator:(id<UICollectionViewDropCoordinator>)coordinator
{
// 如果coordinator.destinationIndexPath存在,直接返回;如果不存在,则返回(0,0)位置。
NSIndexPath *destinationIndexPath = coordinator.destinationIndexPath ? coordinator.destinationIndexPath : [NSIndexPath indexPathForItem:0 inSection:0];
GIRPhotoWallData *data = [self.photos objectAtIndex:destinationIndexPath.row];
if (data.media == nil) {
return;
}
// 在collectionView内,重新排序时只能拖动一个cell。
if (coordinator.items.count == 1 && coordinator.items.firstObject.sourceIndexPath) {
NSIndexPath *sourceIndexPath = coordinator.items.firstObject.sourceIndexPath;
// 将多个操作合并为一个动画。
[collectionView performBatchUpdates:^{
// 将拖动内容从数据源删除,插入到新的位置。
GIRPhotoWallData *imageName = coordinator.items.firstObject.dragItem.localObject;
[self.photos removeObjectAtIndex:sourceIndexPath.item];
[self.photos insertObject:imageName atIndex:destinationIndexPath.item];
// 更新collectionView。
[collectionView moveItemAtIndexPath:sourceIndexPath toIndexPath:destinationIndexPath];
} completion:nil];
// 以动画形式移动cell。
[coordinator dropItem:coordinator.items.firstObject.dragItem toItemAtIndexPath:destinationIndexPath];
}
}