Quello che voglio ottenere è lo stesso comportamento che questa visione di scorrimento ha:Come fare un UIScrollView scatto alle icone (come App Store: Feature)
So che questo è utilizzando HTML e non l'API nativa, ma sto cercando di implementarlo come componente UIKit.
Ora, per il comportamento che sto cercando:
- Si noti che si tratta di una visione di scorrimento di paging, ma la "dimensione della pagina" è minore la larghezza della vista.
- Quando lo si scorre da sinistra a destra, ciascuna pagina "scatta" sull'elemento più a sinistra.
- Quando lo si scorre dall'estremità destra a sinistra, "scatta" sull'elemento più a destra.
La stessa pagina, ma ora da destra a sinistra:
che cosa ho provato:
- Ho provato a fare la vista di scorrimento più piccolo è super vista e hitTest override, e questo mi ha fatto un comportamento da sinistra a destra.
- Ho provato a implementare scrollViewWillEndDragging: withVelocity: targetContentOffset: e impostando il targetContentOffset che desidero ma poiché non riesco a cambiare la velocità, scorre semplicemente troppo lentamente o troppo velocemente.
- Ho provato a implementare scrollViewDidEndDecelerating: e quindi l'animazione all'offset corretto, ma la vista di scorrimento prima si arresta e poi si sposta, non sembra naturale.
- Ho provato a implementare scrollViewDidEndDragging: willDecelerate: e quindi l'animazione all'offset corretto ma la vista di scorrimento "salta" e non si anima correttamente.
Sono fuori di idee.
Grazie!
Aggiornamento:
ho finito per usare il metodo di Rob Mayoff, sembra pulito. L'ho modificato in modo che funzionasse quando la velocità era 0, ad esempio quando un utente trascina, ferma e rilascia il dito.
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
withVelocity:(CGPoint)velocity
targetContentOffset:(CGPoint *)targetContentOffset {
CGFloat maxOffset = scrollView.contentSize.width - scrollView.bounds.size.width;
CGFloat minOffset = 0;
if (velocity.x == 0) {
CGFloat targetX = MAX(minOffset,MIN(maxOffset, targetContentOffset->x));
CGFloat diff = targetX - baseOffset;
if (ABS(diff) > offsetStep/2) {
if (diff > 0) {
//going left
baseOffset = MIN(maxOffset, baseOffset + offsetStep);
} else {
//going right
baseOffset = MAX(minOffset, baseOffset - offsetStep);
}
}
} else {
if (velocity.x > 0) {
baseOffset = MIN(maxOffset, baseOffset + offsetStep);
} else {
baseOffset = MAX(minOffset, baseOffset - offsetStep);
}
}
targetContentOffset->x = baseOffset;
}
L'unico problema con questa soluzione è che scorrere la vista di scorrimento non produce l'effetto "rimbalzo". Sembra "bloccato".
Qualsiasi possibilità che ciò possa essere ottenuto utilizzando UITableView/UICollectionView?Voglio lo stesso effetto scroll e snap ma con la tabella/collezione per visualizzare in anteprima gli elementi successivi/precedenti come quello di iTunes. Fare qualcosa come 4 righe in 1 tabella/collezione di colonne. –
Per tutti coloro che desiderano correggere la sensazione "bloccata": se abs (velocity.x) è più grande di dire 0.8, è possibile aggiungere/sottrarre due offsetSteps invece di uno. – lassej
Non dimenticare il modo incredibilmente semplice per farlo. (In particolare con l'autolayout, FACCIA LA VISUALIZZAZIONE SCRIT LITERALE ** SEMPLICEMENTE IL FORMATO DELL'UNITÀ **. E falla pagina. È semplicemente così semplice. Usa una tecnica super-ingegnosa [simile a questa] (http: // stackoverflow.com/a/37505837/294884) se necessario per regolare "area tangibile" – Fattie