UIView animateKeyframesWithDuration vs standard-animation-block-animation unterscheiden

Vor kurzem fand ich einige UIView animation-code und bemerkt, dass es nicht mit der animateKeyframesWithDuration:delay:options:animations:completion: Methode richtig und habe seither versucht, es zu beheben, aber aus irgendeinem Grund die Animationen sind nicht identisch.

Hier ist der code, den ich gefunden habe:

view.transform = CGAffineTransformMakeTranslation(300, 0);

[UIView animateKeyframesWithDuration:duration/4 delay:delay options:0 animations:^{
    //End
    view.transform = CGAffineTransformMakeTranslation(-10, 0);
} completion:^(BOOL finished) {
    [UIView animateKeyframesWithDuration:duration/4 delay:0 options:0 animations:^{
        //End
        view.transform = CGAffineTransformMakeTranslation(5, 0);
    } completion:^(BOOL finished) {
        [UIView animateKeyframesWithDuration:duration/4 delay:0 options:0 animations:^{
            //End
            view.transform = CGAffineTransformMakeTranslation(-2, 0);
        } completion:^(BOOL finished) {
            [UIView animateKeyframesWithDuration:duration/4 delay:0 options:0 animations:^{
                //End
                view.transform = CGAffineTransformMakeTranslation(0, 0);
            } completion:^(BOOL finished) {
            }];
        }];
    }];
}];

Gibt es zwei Probleme:

  1. Sollte man wirklich ein key-frame-animation anstelle von Schachtelung von Animationen innerhalb der completion-block.
  2. Bei der Verwendung animateKeyframesWithDuration:delay:options:animations:completion: Sie nennen soll die addKeyframeWithRelativeStartTime:relativeDuration:animations: - Methode innerhalb der animation block. Wenn Sie nicht diese Methode aufrufen, dann ist diese Methode verhält sich wie ein standard-UIView animation-block.

Siehe Apple Dokumentation zu dieser Methode hier.

So, ich habe versucht, dieses Problem zu beheben, nutzen Sie die Methode korrekt:

view.transform = CGAffineTransformMakeTranslation(300, 0);
double frameDuration = 1.0/4.0; //4 = number of keyframes

[UIView animateKeyframesWithDuration:duration delay:delay options:0 animations:^{
    [UIView addKeyframeWithRelativeStartTime:0*frameDuration relativeDuration:frameDuration animations:^{
        view.transform = CGAffineTransformMakeTranslation(-10, 0);
    }];
    [UIView addKeyframeWithRelativeStartTime:1*frameDuration relativeDuration:frameDuration animations:^{
        view.transform = CGAffineTransformMakeTranslation(5, 0);
    }];
    [UIView addKeyframeWithRelativeStartTime:2*frameDuration relativeDuration:frameDuration animations:^{
        view.transform = CGAffineTransformMakeTranslation(-2, 0);
    }];
    [UIView addKeyframeWithRelativeStartTime:3*frameDuration relativeDuration:frameDuration animations:^{
        view.transform = CGAffineTransformMakeTranslation(0, 0);
    }];
} completion:nil];

Fühle ich mich wie die beiden Animationen sollen identisch sein, aber Sie sind es nicht. Was habe ich falsch gemacht in meinem Versuch?

Edit: Beispiel-Projekt (Verwenden Sie Befehl + T Umschalten langsame Animationen im simulator)

  • "allerdings sind Sie nicht." können Sie das noch näher erläutern? Wie unterscheiden Sie sich?
  • Tut mir Leid, ich sollte wirklich Hinzugefügt haben, ein Beispiel-Projekt, das habe ich nun Hinzugefügt. Das timing der keyframes einfach nicht passen. Auch: wow, David Rönnqvist! Ihre Löschen* Animation Code post ist der Grund, warum ich gepostet diese Frage!
InformationsquelleAutor iMaddin | 2014-03-12
Schreibe einen Kommentar