Actualmente estoy tratando de implementar el comportamiento de reordenamiento UITableView utilizando UICollectionView.UICollectionView efectiva arrastrar y soltar
Vamos a llamar a un UITableView TV y una UICollectionView CV (para aclarar la explicación siguiente)
básicamente estoy tratando de reproducir el arrastrar y soltar & de la televisión, pero no estoy utilizando el modo de edición , la celda está lista para moverse tan pronto como se active el gesto de presión prolongada. Funciona perfectamente, estoy usando el método de movimiento del CV, todo está bien.
Actualizo la propiedad contentOffset del CV para manejar el desplazamiento cuando el usuario está arrastrando una celda. Cuando un usuario va a un rect concreto en la parte superior e inferior, actualizo contentOffset y CV scroll. El problema es cuando el usuario deja de mover su dedo, el gesto no envía ninguna actualización que hace que el desplazamiento se detenga y vuelva a comenzar tan pronto como el usuario mueva su dedo.
Este comportamiento definitivamente no es natural, prefiero continuar desplazándome hasta que el usuario libere la CV como es el caso en la TV. La experiencia de caída del arrastre de TV & es impresionante y realmente quiero reproducir la misma sensación. ¿Alguien sabe cómo manejan el rollo en la TV durante el reordenamiento?
- He intentado utilizar un temporizador para activar una acción de desplazamiento varias veces, siempre y cuando la posición gesto está en el lugar correcto, el rollo era horrible y no muy productivo (muy lento y nervioso).
- También traté de usar GCD para escuchar la posición del gesto en otro hilo, pero el resultado es aún peor.
Me quedé sin idea sobre eso, así que si alguien tiene la respuesta, ¡me casaría con él!
Aquí está la implementación del método LongPress:
- (void)handleLongPress:(UILongPressGestureRecognizer *)sender
{
ReorganizableCVCLayout *layout = (ReorganizableCVCLayout *)self.collectionView.collectionViewLayout;
CGPoint gesturePosition = [sender locationInView:self.collectionView];
NSIndexPath *selectedIndexPath = [self.collectionView indexPathForItemAtPoint:gesturePosition];
if (sender.state == UIGestureRecognizerStateBegan)
{
layout.selectedItem = selectedIndexPath;
layout.gesturePoint = gesturePosition; // Setting gesturePoint invalidate layout
}
else if (sender.state == UIGestureRecognizerStateChanged)
{
layout.gesturePoint = gesturePosition; // Setting gesturePoint invalidate layout
[self swapCellAtPoint:gesturePosition];
[self manageScrollWithReferencePoint:gesturePosition];
}
else
{
[self.collectionView performBatchUpdates:^
{
layout.selectedItem = nil;
layout.gesturePoint = CGPointZero; // Setting gesturePoint invalidate layout
} completion:^(BOOL completion){[self.collectionView reloadData];}];
}
}
Para hacer el desplazamiento CV, estoy usando ese método:
- (void)manageScrollWithReferencePoint:(CGPoint)gesturePoint
{
ReorganizableCVCLayout *layout = (ReorganizableCVCLayout *)self.collectionView.collectionViewLayout;
CGFloat topScrollLimit = self.collectionView.contentOffset.y+layout.itemSize.height/2+SCROLL_BORDER;
CGFloat bottomScrollLimit = self.collectionView.contentOffset.y+self.collectionView.frame.size.height-layout.itemSize.height/2-SCROLL_BORDER;
CGPoint contentOffset = self.collectionView.contentOffset;
if (gesturePoint.y < topScrollLimit && gesturePoint.y - layout.itemSize.height/2 - SCROLL_BORDER > 0)
contentOffset.y -= SCROLL_STEP;
else if (gesturePoint.y > bottomScrollLimit &&
gesturePoint.y + layout.itemSize.height/2 + SCROLL_BORDER < self.collectionView.contentSize.height)
contentOffset.y += SCROLL_STEP;
[self.collectionView setContentOffset:contentOffset];
}
Publicación respuestas que no son más que un enlace no se recomienda. Resumir el contenido de la publicación mejoraría en gran medida esta respuesta. – David
Gracias por la respuesta, eso es lo que estoy buscando. Él maneja el rollo con un temporizador pero lo hace de una manera más inteligente que yo. Me dio la prueba de que un temporizador podría hacer el truco, echaré un vistazo a esa solución, gracias de nuevo. El código es silencioso y no respeta los estándares de Apple para CVC, pero su solución para el desplazamiento es interesante. ¡Gracias! – foOg
Muy simple, gracias. Lo único es que, al arrastrar un elemento, su fondo se vuelve negro. Su fondo original es claro (transparente). Trataré de arreglarlo e informaré. – ancajic