Aggiungerò un'altra soluzione. Lo snap in atto non è perfetto (non è buono come quando è impostato il paging abilitato, ma funziona abbastanza bene).
Ho provato a implementare la soluzione Soroush, ma non funziona per me.
Perché il UICollectionView
è una sottoclasse di UIScrollView
risponderà ad un importante metodo di UIScrollViewDelegate
che è:
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
withVelocity:(CGPoint)velocity
targetContentOffset:(inout CGPoint *)targetContentOffset
Il targetContentOffset
(un inout puntatore) ti permette di ridefinire il punto di sosta per una vista di raccolta (lo x
in questo caso se si scorre orizzontalmente).
Una breve nota circa un paio di variabili che trovate di seguito:
self.cellWidth
- questa è la larghezza tua collezione di cellule vista (si può anche hardcode lì se si vuole)
self.minimumLineSpacing
- questa è la spaziatura minima tra le celle
self.scrollingObjects
è la matrice di oggetti contenuti nella vista di raccolta (ho bisogno di questo principalmente per contare, per sapere quando smettere di scorrimento)
Così, l'idea è quella di implementare questo metodo nella delegato della vista raccolta, in questo modo:
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
withVelocity:(CGPoint)velocity
targetContentOffset:(inout CGPoint *)targetContentOffset
{
if (self.currentIndex == 0 && velocity.x < 0) {
// we have reached the first user and we're trying to go back
return;
}
if (self.currentIndex == (self.scrollingObjects.count - 1) && velocity.x > 0) {
// we have reached the last user and we're trying to go forward
return;
}
if (velocity.x < 0) {
// swiping from left to right (going left; going back)
self.currentIndex--;
} else {
// swiping from right to left (going right; going forward)
self.currentIndex++;
}
float xPositionToStop = 0;
if (self.currentIndex == 0) {
// first row
xPositionToStop = 0;
} else {
// one of the next ones
xPositionToStop = self.currentIndex * self.cellWidth + (self.currentIndex + 1) * self.minimumLineSpacing - ((scrollView.bounds.size.width - 2*self.minimumLineSpacing - self.cellWidth)/2);
}
targetContentOffset->x = xPositionToStop;
NSLog(@"Point of stopping: %@", NSStringFromCGPoint(*targetContentOffset));
}
In attesa di tutte le risposte si possono avere che rende lo scatto in posizione migliore.Devo dire anche continuo a ricerca di una soluzione migliore ...
Questo, tuttavia, non passa selezionare ed eventi toccare correttamente attraverso alla vista insieme sottostante come di iOS7. Qualche idea? – eanticev
Su iOS7 (almeno potrebbe essere stato vero prima di questo) non è necessario lo scrollview. Rileva solo i gesti di scorrimento sinistro e destro e usali per impostare l'offset della tua vista di raccolta 1 pagina avanti/indietro. – buildsucceeded
Non riesco a farlo funzionare correttamente su iOS7. 'scrollViewDidScroll' di una vista di scorrimento" segreta "non vengono mai consegnati. –