Ho provato a impostare la durata (con i metodi normali che vorrei provare) per impostare la durata dell'animazione per il metodo selectItemAtIndexPath:animated:scrollPosition:
di UICollectionView (o il metodo scrollToItemAtIndexPath:atScrollPosition:animated:
). Ho provato [UIView setAnimationDuration]
e ho provato a confezionarlo in un CATransaction
. Fino a questo punto non sono riuscito a cambiare la durata dell'animazione (anche se ammetto di aver commesso un errore in questa logica).Durata animazione per UICollectionView selectItemAtIndexPath: animato: scrollPosition:
Pensieri?
UPDATE:
ho cercato un buon numero di approcci qui. La soluzione più vicina è fare ciò che faremmo normalmente per l'animazione UIScrollView
(impostando l'argomento animato: su NO
e avvolgendolo in un blocco di animazione UIView
). Questo funziona perfettamente bene per la scrollview. Tuttavia, questo avvita con il processo di creazione UICollectionView
per qualche motivo.
Ho incluso un esempio sotto utilizzando due approcci. Ogni approccio presuppone che tu abbia 4 sezioni con 4 elementi in ciascuna sezione. Inoltre, l'animazione presuppone che tu stia passando da 0,0 a 3,3.
Utilizzando animazione di default
Parte del problema qui certamente sembra legato alla UICollectionView
. Se si prende il seguente approccio (utilizzando l'opzione di animazione predefinita) - tutto funziona benissimo:
[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:3 inSection:3]
atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally
animated:YES];
Quando questo viene eseguito, ogni cella si crea in-tra le celle visibili attuali e la cella di destinazione. Ho incluso la registrazione sul metodo collectionView:cellForItemAtIndexPath:
:
2013-05-18 09:33:24.366 DEF-CV-Testing[75463:c07] Transition
Cell Created for Index Path: <NSIndexPath 0x8913f40> 2 indexes [0, 1]
Cell Created for Index Path: <NSIndexPath 0x75112e0> 2 indexes [0, 2]
Cell Created for Index Path: <NSIndexPath 0xfe1a6c0> 2 indexes [0, 3]
Cell Created for Index Path: <NSIndexPath 0x89159e0> 2 indexes [1, 0]
Cell Created for Index Path: <NSIndexPath 0x8a10e70> 2 indexes [1, 1]
Cell Created for Index Path: <NSIndexPath 0x7510d90> 2 indexes [1, 2]
Cell Created for Index Path: <NSIndexPath 0x75112a0> 2 indexes [1, 3]
Cell Created for Index Path: <NSIndexPath 0x8915a00> 2 indexes [2, 0]
Cell Created for Index Path: <NSIndexPath 0x75111c0> 2 indexes [2, 1]
Cell Created for Index Path: <NSIndexPath 0xfe17f30> 2 indexes [2, 2]
Cell Created for Index Path: <NSIndexPath 0xfe190c0> 2 indexes [2, 3]
Cell Created for Index Path: <NSIndexPath 0xfe16920> 2 indexes [3, 0]
Cell Created for Index Path: <NSIndexPath 0x75112a0> 2 indexes [3, 1]
Cell Created for Index Path: <NSIndexPath 0xfe1a4f0> 2 indexes [3, 2]
Cell Created for Index Path: <NSIndexPath 0x75142d0> 2 indexes [3, 3]
Utilizzando Animazione personalizzata
Quando avvolgendo il metodo scrollToItemAtIndexPath:
in un blocco UIView
animazione, gli elementi non vengono create correttamente. Vedere il codice di esempio qui:
[UIView animateWithDuration:5.0 delay:0.0 options:0 animations:^{
[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:3 inSection:3]
atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally
animated:NO];
} completion:^(BOOL finished) {
NSLog(@"Completed");
}];
Le celle attualmente visibili scompaiono e viene creata solo la destinazione. Ho incluso la stessa registrazione sul metodo collectionView:cellForItemAtIndexPath:
:
Transition
Cell Created for Index Path: <NSIndexPath 0x71702f0> 2 indexes [3, 3]
Completed
Hai provato a impostare l'animazione su NO e quindi a racchiuderlo in un 'UIView animateWithDuration'? Ecco come lo faccio per una delle mie animazioni scrollview. Faccio '[UIView animtateWithDuration ... [scrollView scrollToRect..' – Kal
Sì. Sfortunatamente questo rovina la creazione della cella. Scorre - ma mostra solo il primo e l'ultimo UICollectionViewsCell nell'animazione. – dtuckernet
Solo per curiosità, hai anche provato a forzare la brutezza dell'animazione all'interno del blocco stesso. '[UIView animateWithDuration: .... animations:^{[self.colectionView scrollToItemAtIndexPath: [0, 1]; self.collectionView.scrollToItemAtIndexpath [0,2]; .... self.collectionView.scrollToItemAtIndexPath [3,3]; ' – Kal