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

Schreibe einen Kommentar