sirven que para los inicio gestos flotante desde boton assistive activar ios objective-c drag-and-drop uiimageview uicollectionview

ios - que - Cambiar la posición de las celdas por gesto



gestos iphone 7 (1)

En realidad, he estado usando LXReorderableCollectionViewFlowLayout y se adapta perfectamente a ti y también tiene un ejemplo en su repositorio. Al principio, no sugiero que uses el gesto deslizar porque entra en conflicto con el manejo interno de gestos para UICollectionView, pero si estás seguro de que lo necesitas, debes implementar métodos de delegación para agregar gestos y resolver gestos simultáneos como lo hace LXReordableCollectionViewFlowLayout:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { if ([self.panGestureRecognizer isEqual:gestureRecognizer]) { return (self.selectedItemIndexPath != nil); } return YES; } - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { if ([self.longPressGestureRecognizer isEqual:gestureRecognizer]) { return [self.panGestureRecognizer isEqual:otherGestureRecognizer]; } if ([self.panGestureRecognizer isEqual:gestureRecognizer]) { return [self.longPressGestureRecognizer isEqual:otherGestureRecognizer]; } return NO; }

De todos modos, no te sugiero que reinicies lo que se hace en LXReordableCollectionViewFlowLayout y simplemente lo utilices para tus necesidades. Si está usando Storyboard, necesita colocar su UICollectionView en su UIViewController y cambiar la clase UICollectionViewFlowLayout por defecto en LXReorderableCollectionViewFlowLayout así como así Además, su delegado para UICollectionView debería conformarse con los siguientes protocolos: LXReorderableCollectionViewDataSource (extiende UICollectionViewDataSource) y LXReorderableCollectionViewDelegateFlowLayout (extiende UICollectionViewDelegateFlowLayout), lo que le permite usar su clase. Para sus necesidades, es suficiente para proporcionar los siguientes métodos:

- (void)collectionView:(UICollectionView *)collectionView itemAtIndexPath:(NSIndexPath *)fromIndexPath willMoveToIndexPath:(NSIndexPath *)toIndexPath { id from = [items objectAtIndex:fromIndexPath.item]; id to = [items objectAtIndex:toIndexPath.item]; [items replaceObjectAtIndex:fromIndexPath.item withObject:to]; [items replaceObjectAtIndex:toIndexPath.item withObject:from];; } - (BOOL)collectionView:(UICollectionView *)collectionView canMoveItemAtIndexPath:(NSIndexPath *)indexPath { return YES; } - (BOOL)collectionView:(UICollectionView *)collectionView itemAtIndexPath:(NSIndexPath *)fromIndexPath canMoveToIndexPath:(NSIndexPath *)toIndexPath { return YES; }

Para tener exactamente el comportamiento que necesita, debe ingresar a la clase LXReorderableCollectionViewFlowLayout y cambiar el método invalidateLayoutIfNecessary para que realice otro tipo de actualización en lugar de hacerlo antes:

- (void)invalidateLayoutIfNecessary { NSIndexPath *newIndexPath = [self.collectionView indexPathForItemAtPoint:self.currentView.center]; NSIndexPath *previousIndexPath = self.selectedItemIndexPath; if ((newIndexPath == nil) || [newIndexPath isEqual:previousIndexPath]) { return; } if ([self.dataSource respondsToSelector:@selector(collectionView:itemAtIndexPath:canMoveToIndexPath:)] && ![self.dataSource collectionView:self.collectionView itemAtIndexPath:previousIndexPath canMoveToIndexPath:newIndexPath]) { return; } self.selectedItemIndexPath = newIndexPath; if ([self.dataSource respondsToSelector:@selector(collectionView:itemAtIndexPath:willMoveToIndexPath:)]) { [self.dataSource collectionView:self.collectionView itemAtIndexPath:previousIndexPath willMoveToIndexPath:newIndexPath]; } __weak typeof(self) weakSelf = self; [self.collectionView performBatchUpdates:^{ __strong typeof(self) strongSelf = weakSelf; if (strongSelf) { // NOTE: cells swipe [strongSelf.collectionView moveItemAtIndexPath:previousIndexPath toIndexPath:newIndexPath]; [strongSelf.collectionView moveItemAtIndexPath:newIndexPath toIndexPath:previousIndexPath]; // NOTE: it was here previously // [strongSelf.collectionView deleteItemsAtIndexPaths:@[ previousIndexPath ]]; // [strongSelf.collectionView insertItemsAtIndexPaths:@[ newIndexPath ]]; } } completion:^(BOOL finished) { __strong typeof(self) strongSelf = weakSelf; if ([strongSelf.dataSource respondsToSelector:@selector(collectionView:itemAtIndexPath:didMoveToIndexPath:)]) { [strongSelf.dataSource collectionView:strongSelf.collectionView itemAtIndexPath:previousIndexPath didMoveToIndexPath:newIndexPath]; } }]; }

Funciona bien para las celdas que están cerca del ítem inicial, pero una vez que se movió su tarjeta, podría ser engañoso para el usuario dónde moverla después, de todos modos solo pruébela y vea cómo está sucediendo. Recuerde que puede controlar el movimiento disponible para el artículo por collectionView:itemAtIndexPath:canMoveToIndexPath: method.

Espero que esto te ayude

Tengo UICollectionView en el que tengo un prototipo de celda y UIImageView en él. Estoy mostrando imágenes aleatorias en UICollectionView .

Ahora quiero intercambiar la posición de UIImageView hasta la celda cercana. He intentado deslizar el dedo y presionar con el gesto hacia atrás. A continuación, aparece el código que he hecho:

- (IBAction)LongPress:(UILongPressGestureRecognizer *)sender { if (sender.state != UIGestureRecognizerStateEnded) { return; } CGPoint p = [sender locationInView:self.collectionView]; NSIndexPath *indexPath = [self.coll_out indexPathForItemAtPoint:p]; if (indexPath == nil) { NSLog(@"couldn''t find index path"); } else { // get the cell at indexPath (the one you long pressed) UICollectionViewCell* cell =[self.coll_out cellForItemAtIndexPath:indexPath]; // do stuff with the cell } }

Y también intenté el método de delegado:

- (void)moveItemAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath { NSMutableArray *item1=[arr_final objectAtIndex:indexPath.section]; NSMutableArray *item2=[arr_final objectAtIndex:newIndexPath.section]; NSLog(@"%@ %@",item1,item2); NSString *index = [item1 objectAtIndex:indexPath.item]; [item1 removeObjectAtIndex:indexPath.item]; [item2 insertObject:index atIndex:newIndexPath.item]; }

La funcionalidad es como arrastrar y soltar. He visto ejemplos de

Por favor, dame la forma correcta y el código para deslizar a la celda cercana. Gracias...