2012-12-14 9 views
11

dire che ho un UICollectionView utilizzando un UICollectionViewFlowLayout e il seguente formato:È possibile scambiare 2 celle in un UICollectionView che utilizza UICollectionViewFlowLayout?

1 2 3 
4 5 6 
7 8 9 

tocco delle cellule 9 e trascinare il puntatore cella 6, lo spostamento delle cellule 9 al punto in cui cellule 6 è e 6 celle a dove cella 9 è stato:

1 2 3 
4 5 9 
7 8 6 

esiste un modo per spostarsi agevolmente e animare cellulare 6 a dove cella 9 è così come spostare e animare cellule 9 a cui celle 6 è? O devo sottoclasse UICollectionViewLayout? Se devo sottoclasse UICollectionViewLayout, come si farebbe? Ho provato a installare in modo esplicito i centri delle celle in

-(UICollectionViewLayoutAttributes*)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath

ma senza alcun successo.

risposta

20

Dopo molti sbattere la testa, la soluzione che ho trovato è utilizzare moveItemAtIndexPath:toIndexPath all'interno di . Secondo il documentation per :

È possibile utilizzare questo metodo nei casi in cui si desidera inserire, cancellare, ricaricare o spostare le celle attorno alla vista di raccolta in una sola operazione animata, invece che in diverse animazioni separati. Utilizzare il bloccato passato nel parametro updates per specificare tutte le operazioni che si desidera eseguire.

Allora, che cosa ho fatto è stato essenzialmente

[self performBatchUpdates:^{ 
    [self moveItemAtIndexPath:fromIp toIndexPath:toIp]; 
    [self moveItemAtIndexPath:toIp toIndexPath:fromIp]; 
} completion:^(BOOL finished) { 
    // update data source here 
    // e.g [dataSource exchangeObjectAtIndex:fromIp.row withObjectAtIndex:toIp.row]; 
}]; 
+0

Puoi fornire qualche codice o tutorial in cui è stato spiegato questo specifico problema. come hai risolto questo problema? – Zac24

+1

Puoi fornire qualche indizio su questo problema in questa domanda? http://stackoverflow.com/questions/25803120/how-to-rotate-an-image-on-touch-and-drag-image-over-another-image/25803505?noredirect=1#comment40364549_25803505 – Zac24

+0

Ciao Zac24. Non sono a conoscenza di alcun codice di esempio per questo problema specifico. Scusate. –

0

Hai provato a riordinare gli articoli direttamente utilizzando moveItemAtIndexPath: toIndexPath:?

-Assicurarsi di riordinare la raccolta del modello sottostante in modo che le modifiche vengano applicate al successivo riavvio completo.

+0

Sì, ho provato a farlo. Ma dal momento che sto usando UICollectionViewFlowLayout, l'animazione non funziona correttamente poiché tenta di aggiornare le celle tra i percorsi dell'indice di origine e di destinazione. –

0

Swift code:

 self.collectionView.performBatchUpdates({ 
      self.collectionView.moveItem(at: selectedIndexPath, to: targetIndexPath) 
      self.collectionView.moveItem(at: targetIndexPath, to: selectedIndexPath) 
     }, completion: nil) 
Problemi correlati