2016-07-22 7 views
1

UICollectionView Unterstützung für das Umordnen von Zellen in iOS 9 hinzugefügt, aber die Live-Interaktion funktioniert nicht ordnungsgemäß, wenn alle Zellen nicht die gleiche Größe haben:UICollectionView integrierte Neuordnung funktioniert nicht ordnungsgemäß für Zellen unterschiedlicher Größe

Hinweis in diesem Screen-Capture, wie Zellen # 3 und # 2, die die gleiche Größe haben, funktioniert einwandfrei, während es nicht für Zellen # 3 und # 1 Austausch: es

enter image description here

Grundsätzlich erscheint Die UICollectionView berechnet das Layout der anderen Zellen nicht neu, während die Auswahl verschoben wird d Zelle. Kennt jemand eine Arbeit herum?

Ein anderes verwandtes Problem ist, dass wenn die Neuordnung von Zellen unterschiedlicher Größe abgeschlossen ist, müssen Sie das Layout UICollectionView manuell ungültig machen, sonst haben einige Zellen ungültige Positionen und Überlappungen.

PS: Ich bin mit einem langen Druck Gestenerkenner und diese Methoden aufrufen je nach Bedarf:

- (BOOL)beginInteractiveMovementForItemAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(9_0); // returns NO if reordering was prevented from beginning - otherwise YES 
- (void)updateInteractiveMovementTargetPosition:(CGPoint)targetPosition NS_AVAILABLE_IOS(9_0); 
- (void)endInteractiveMovement NS_AVAILABLE_IOS(9_0); 
- (void)cancelInteractiveMovement NS_AVAILABLE_IOS(9_0); 

Antwort

2

Für diejenigen, die dieses Problem haben, ist der Grund, dass UICollectionView die Layout nicht neu ordnen, Attribute für die Elemente während des Ziehens geschieht.

Was ich meine ist, dass, wenn Element # 2 50x50 ist und Element # 3 100x100 ist, während Live-Elemente ziehen und tauschen sie, UICollectionView nicht automatisch ihre Größen auch. Was immer an Position 2 ist, wird immer als 50x50 angenommen und was auch immer an Position 3 ist, wird immer als 100x100 angenommen.

Die Lösung besteht darin, sicherzustellen, dass beim Verschieben eines Elements die UICollectionView Datenquelle fortlaufend aktualisiert wird, um die neue Position widerzuspiegeln. Der beste Weg, dies zu tun, scheint in der UICollectionView Delegiertenmethode zu sein:

- (NSIndexPath *)collectionView:(UICollectionView *)collectionView 
     targetIndexPathForMoveFromItemAtIndexPath:(NSIndexPath *)originalIndexPath 
     toProposedIndexPath:(NSIndexPath *)proposedIndexPath