Was ich will ist das gleiche Verhalten bekommen, dass diese Scroll-Ansicht hat:Wie ein UIScrollView zu Ikonen Snap machen (wie App Store: Feature)
Ich weiß, dass dies mit Hilfe von HTML und nicht die native API, aber ich versuche, sie als UIKit-Komponente zu implementieren. Jetzt
, auf das Verhalten, die ich suche:
- Beachten Sie, dass es sich um eine ausgelagerte Scroll-Ansicht ist, aber die „Seitengröße“ ist kleiner als die Breite der Ansicht.
- Wenn Sie einen Bildlauf von links nach rechts durchführen, "schnappt" jede Seite auf das Element ganz links.
- Wenn Sie vom rechten Ende nach links blättern, "schnappt" das Objekt am weitesten rechts.
Die gleiche Seite, aber jetzt von rechts nach links:
Was ich habe versucht:
- Ich habe versucht, so dass die Bildlaufansicht kleiner als es ist Super View und Overriding HitTest, und das hat mir dieses Links-zu-Rechts-Verhalten gebracht.
- ich scrollViewWillEndDragging habe versucht Umsetzung: withVelocity: targetContentOffset: und Einstellung der targetContentOffset ich will, aber da ich die Geschwindigkeit nicht ändern kann es langsam oder zu schnell einfach zu scrollt.
- Ich habe versucht scrollViewDidEndDecelerating Umsetzung: und dann auf die richtige Animieren versetzt aber die Scroll-Ansicht stoppt zuerst bewegt sich dann, es nicht natürlich aussehen.
- Ich habe versucht scrollViewDidEndDragging Umsetzung: willDecelerate: und dann auf die richtige Animieren versetzt aber die Scroll-Ansicht „springt“ und animieren nicht richtig.
Ich habe keine Ideen mehr.
Danke!
Update:
I Rob Mayoff Methode mit endete, sieht es sauber. Ich habe es so geändert, dass es funktioniert, wenn die Geschwindigkeit 0 ist, zum Beispiel wenn ein Benutzer den Finger zieht, stoppt und den Finger loslässt.
- (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;
}
Das einzige Problem bei dieser Lösung besteht darin, dass die Scroll-Ansicht klauen nicht die „Bounce“ -Effekt erzeugt. Es fühlt sich "fest" an.
Eine Chance, dass dies mit einer UITableView/UICollectionView erreicht werden könnte?Ich möchte den gleichen Scroll- und Snap-Effekt, aber mit der Tabelle/Sammlung, um die nächsten/vorherigen Elemente wie die in iTunes anzuzeigen. So etwas wie 4 Zeilen in 1 Spalte Tabelle/Sammlung zu tun. –
Für alle, die das "stecken gebliebene" Gefühl beheben möchten: Wenn abs (velocity.x) größer als beispielsweise 0.8 ist, können Sie zwei offsetSteps statt eins addieren/subtrahieren. – lassej
Vergessen Sie nicht die unglaublich einfache Art, dies zu tun. (Besonders mit Auto-Layout. NUR DIE LITERAL SCROLL VIEW, ** Einfach die Größe der "Einheit" **. Und machen Sie es Seite. Es ist nur so einfach. Verwenden Sie super-geniale [Technik etwas wie das] (http: // stackoverflow.com/a/37505837/294884) wenn nötig, um "touchable area" anzupassen – Fattie