Wie man richtig animieren UIScrollView contentOffset
Habe ich UIScrollView Unterklasse. Ihr Inhalt ist wiederverwendbar - über 4 oder 5 Ansichten werden verwendet, um anzuzeigen, Hunderte von Elementen (auch beim scrollen-versteckte Objekte wiederverwendet und springt an eine andere Stelle, wenn Sie gebraucht wird, um Sie zu sehen)
Was ich brauche: Fähigkeit, automatisch Blättern meine scroll-Ansicht auf eine beliebige position. Zum Beispiel mein scroll-Ansicht zeigt 4., 5. und 6. element und wenn ich Tippen Sie auf eine Schaltfläche, die es braucht, um einen Bildlauf bis 30-element. In anderen Worten, ich brauche standard-Verhalten von UIScrollView.
Dies funktioniert gut:
[self setContentOffset:CGPointMake(index*elementWidth, 0) animated:YES];
aber ich brauche einige Anpassungen. Zum Beispiel, ändern Sie die animation Dauer, fügen Sie einige code, um auf das Ende der animation.
Offensichtliche Lösung:
[UIView animateWithDuration:3 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
[self setContentOffset:CGPointMake(index*elementWidth, 0)];
} completion:^(BOOL finished) {
//some code
}];
aber ich habe einige Maßnahmen verbunden mit scroll-Ereignis, und jetzt sind Sie alle im animation-block und führt dazu, dass alle Untersicht auf die frames zu animieren, auch (Dank der paar wiederverwendbare Elemente alle von Ihnen animiert wird nicht, wie ich will)
Die Frage ist: Wie kann ich benutzerdefinierte animation (in der Tat brauche ich eigene Dauer, Aktionen am Ende und BeginFromCurrentState option) für die Inhalts-offset OHNE animieren alle code, verbunden mit scrollViewDidScroll
Veranstaltung?
UPD:
Dank Andrew ' s Antwort(Erster Teil) habe ich Problem mit animation im inneren scrollViewDidScroll
:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
[UIView performWithoutAnimation:^{
[self refreshTiles];
}];
}
Aber scrollViewDidScroll
muss (für meine Zwecke) führt für jeden frame der animation wie war es im Fall von
[self setContentOffset:CGPointMake(index*elementWidth, 0) animated:YES];
Jedoch, jetzt führt er nur einmal beim start der animation.
Wie kann ich dieses Problem lösen?
InformationsquelleAutor der Frage Lloyd18 | 2014-02-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie versucht, den gleichen Ansatz, aber mit Behinderten animation in
scrollViewDidScroll
?Auf iOS 7, Sie könnten versuchen, wickeln Sie Ihren code in
scrollViewDidScroll
imauf frühere iOS-Versionen, die Sie könnten versuchen:
Update:
Leider das ist, wo Sie schlagen der schwierige Teil der ganzen Sache.
setContentOffset:
ruft die Delegierten nur einmal, es ist gleichbedeutendsetContentOffset:animated:NO
die immer wieder fordert, es nur einmal.setContentOffset:animated:YES
ruft den Delegaten als die animation ändert sich die Grenzen des scrollview und das wollen Sie, aber Sie nicht möchten, dass die animation zur Verfügung gestellt, so dass der einzige Weg, um dieses, dass ich mit oben kommen kann ist die schrittweise Veränderung dercontentOffset
von der scrollview, so dass die animation system nicht nur direkt auf die endgültige Wert, wie im moment der Fall.Zu tun, dass Sie sich ansehen können keyframe-Animationen, so wie für iOS 7:
Diese erhalten Sie zwei updates und natürlich können Sie verwenden einige mathematische und eine Schleife hinzufügen, bis eine Menge mehr von diesen mit den entsprechenden timings.
Auf frühere iOS-Versionen, haben Sie fallen zu lassen, um CoreAnimation für keyframe-Animationen, aber es ist im Grunde die gleiche Sache mit einer etwas anderen syntax.
Methode 2:
Sie können versuchen, polling-der presentationLayer der scrollview für alle änderungen, die mit einem timer, der Sie an den Anfang der animation, da leider der presentationLayer die Eigenschaften sind nicht KVO zu beobachten. Oder Sie können
needsDisplayForKey
in einer Unterklasse der Ebene, um benachrichtigt zu werden, wenn sich die Grenzen ändern, werde das aber erfordert einige Arbeit zu eingerichtet und es verursacht abzeichnen, die möglicherweise Auswirkungen auf die Leistung.Methode 3:
Wäre zu sezieren, was genau passiert auf den scrollView, wenn animiert JA versuchen und abzufangen, die animation, die festgelegt wird, auf den scrollview, und ändern Sie seine Parameter, aber da würden die meisten hacky, zerbrechlich aufgrund von Apple ' s verpasst und schwierigste Methode ist, werde ich nicht darauf eingehen.
InformationsquelleAutor der Antwort Andrew
Einen schönen Weg, dies zu tun ist mit der AnimationEngine Bibliothek. Es ist eine sehr kleine Bibliothek: sechs Dateien, mit drei mehr, wenn Sie wollen gedämpfte Feder Verhalten.
Hinter den kulissen es verwendet eine
CADisplayLink
führen Sie Ihre animation einmal blockieren für jeden frame. Sie erhalten eine saubere block-basierte syntax, die einfach zu bedienen ist, und eine Reihe von interpolation und easing-Funktionendass Sie Zeit sparen.Animieren
contentOffset
:InformationsquelleAutor der Antwort bcattle