Как перетащить UICollectionViewCell из одного UICollectionView в другой UICollectionView?
Я делаю приложение для iPad. На одной странице этого приложения есть UICollectionView с левой стороны и другой UICollectionView с правой стороны. Каждый UICollectionView имеет ширину одного столбца.
функциональность я желаю следующим образом: Каждый UICollectionViewCell с левой стороны должен иметь возможность перетаскиваться в UICollectionView с правой стороны. Если это невозможно, то по крайней мере UICollectionViewCell должен иметь возможность перетаскиваться из левого UICollectionView, а затем я буду обрабатывать его появление в правом UICollectionView.
возможна ли такая функциональность? Если да, то как я буду его реализовывать?
3 ответов
на самом деле нет способа "передать" ячейку из коллекции в другую, но вы можете сделать следующее:
1) Как только вы обнаружите, что пользователь перетащил ячейку в другую коллекцию, удалите ячейку из первой коллекции (назовем ее коллекцией 1). Возможно, вы можете использовать приятную анимацию затухания, чтобы заставить ячейку исчезнуть.
2) Добавьте ячейку во вторую таблицу с хорошей анимацией (см. методы UICollectionView и UICollectionViewLayout и методы делегата для этого.)
вы хотите прикрепить распознаватель жестов длительного нажатия к общему супервизору обоих collectionViews. Операция перетаскивания запускается длительным нажатием, и вся транзакция обрабатывается в этом распознавателе. Поскольку жест панорамирования используется для прокрутки collectionviews, вы столкнетесь с проблемами при попытке использовать распознаватель панорамирования.
ключевым моментом является то, что распознаватель жестов должен быть прикреплен к общему супервизору, а все точки и прямоугольники преобразуется в систему координат супервизора.
это не точный код (это переходит от CV к другому представлению), но процесс будет похожим (примечание: Я попытался удалить некоторый код, который не имеет отношения к вашему приложению, поэтому я мог бы что-то испортить в процессе-но концепция держится):
- (void) processLongPress:(UILongPressGestureRecognizer *)sender
{
if (sender.state == UIGestureRecognizerStateChanged)
{
if (!dragView)
return;
CGPoint location = [sender locationInView:self.view];
CGPoint translation;
translation.x = location.x - dragViewStartLocation.x;
translation.y = location.y - dragViewStartLocation.y;
CGAffineTransform theTransform = dragView.transform;
theTransform.tx = translation.x;
theTransform.ty = translation.y;
dragView.transform = theTransform;
[self.view bringSubviewToFront:dragView];
return;
}
if (sender.state == UIGestureRecognizerStateBegan)
{
// if point gives a valid collectionView indexPath we are doing a long press on a picture item to begin a drag
// & drop operation.
CGPoint point = [sender locationInView:collectionView];
dragViewIndexPath = [collectionView indexPathForItemAtPoint:point];
if (dragViewIndexPath) // i.e., selected item in collection view.
{
UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:dragViewIndexPath];
dragView = [cell.contentView viewWithTag:cell.tag];
[dragView removeFromSuperview];
[self.view addSubview:dragView];
dragView.center = [collectionView convertPoint:point toView:self.view];
dragViewStartLocation = dragView.center;
[self.view bringSubviewToFront:dragView];
}
return;
}
if (sender.state == UIGestureRecognizerStateEnded)
{
if (dragView)
{
dragView.center = CGPointMake(dragView.center.x + dragView.transform.tx, dragView.center.y + dragView.transform.ty);
CGAffineTransform theTransform = dragView.transform;
theTransform.tx = 0.0f;
theTransform.ty = 0.0f;
UIView *dropTarget = [self mapDisplayModeToReceiverView]; // get drop target
CGRect convertedTargetFrame = [self.view convertRect:dropTarget.frame fromView:dropTarget.superview];
if (CGRectContainsPoint(convertedTargetFrame, dragView.center)) // if so, then drop it.
{
ImageWithAttachedLabel *i = (ImageWithAttachedLabel *) dragView;
[speakStrings addObject:[i.labelText stringByAppendingString:@". "]];
UserData *uData = (UserData *)i.userDataObject;
UIImage *image = [[UIImage alloc] initWithData:uData.image];
CGRect newFrame = CGRectMake(0.0f, 0.0f, 140.0f, 140.0f);
ImageWithAttachedLabel *newImage = [[ImageWithAttachedLabel alloc] initWithFrame:newFrame withImage:image withLabel:uData.itemName];
newImage.tag = RECEIVERVIEW_MAGIC_NUMBER;
[self.view addSubview:newImage];
newImage.center = [receiverView convertPoint:dropTarget.center toView:self.view];
[UIView animateWithDuration:0.35f animations:^{ newImage.transform = CGAffineTransformMakeScale(1.15f, 1.15f); newImage.transform = CGAffineTransformIdentity; }
completion:^(BOOL finished) { if (finished)
{
[newImage removeFromSuperview];
newImage.frame = newFrame;
[dropTarget addSubview:newImage];
[dragView removeFromSuperview];
dragView=nil; }
}];
}
else
{
[dragView removeFromSuperview];
dragView = nil;
}
[self reloadData];
return;
}
}
посмотрите на эту статью, я надеюсь, может помочь вам http://weydev.com/en/
в этом проекте вы можете перетаскивать ячейки в двух uicollectionview