UIView-Animationen mit autoreverse
Ich habe ein problem mit der Einstellung UIViewAnimationOptionAutoReverse
.
Hier ist mein code.
CALayer *aniLayer = act.viewToChange.layer;
[UIView animateWithDuration:2.0 delay:1.0 options:(UIViewAnimationCurveLinear | UIViewAnimationOptionAutoreverse) animations:^{
viewToAnimate.frame = GCRectMake(1,1,100,100);
[aniLayer setValue:[NSNumber numberWithFloat:degreesToRadians(34)] forKeyPath:@"transform.rotation"];
} completion:nil ];
Das problem ist, dass, nachdem die animation Umgekehrt hat, die Ansicht springt zurück auf die frame-set in der animation block. Ich möchte die Ansicht zu wachsen und "ungrow" und nicht mehr an seiner ursprünglichen position.
Gibt es eine Lösung ohne Programmierung zwei aufeinanderfolgenden Animationen?
InformationsquelleAutor Stultus | 2011-02-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie drei Optionen.
Wenn Sie die
-[UIView animateWithDuration:…]
Methoden, die änderungen, die Sie in deranimations
block sofort angewendet werden, um die Ansichten in Frage. Es gibt jedoch auch eine impliziteCAAnimation
auf die Ansicht angewendet, belebt, dass aus den alten Wert auf den neuen Wert. Wenn einCAAnimation
aktiv ist, ändert sich die angezeigt Ansicht, ändert aber nicht die tatsächlichen Eigenschaften der Ansicht.Beispielsweise, wenn Sie dies tun:
werden Sie sehen, dass die 'alte Mitte' und 'neue Mitte' sind Verschieden; neue center sofort spiegeln die Werte von newPoint. Jedoch, die
CAAnimation
wurde implizit erstellt werden, verursachen Sie die Ansicht, um noch angezeigt an die Altstadt, und sanft bewegen Sie Ihren Weg, um das neue Zentrum. Wenn die animation abgeschlossen ist, wird es aus der Ansicht entfernt und Sie wieder allein zu sehen, das aktuelle Modell, das Werte.Wenn Sie übergeben
UIViewAnimationOptionAutoreverse
es betrifft die implizit erstelltCAAnimation
, aber keinen Einfluss auf die tatsächliche änderung der Werte. Das ist, wenn unserem Beispiel oben hatten dieUIViewAnimationOptionAutoreverse
definiert, so wird implizit erstelltCAAnimation
würde animieren von oldCenter zu newCenter und zurück. Die animation würde dann entfernt werden, und wir würden wechseln Sie wieder zu sehen, die Werte, die wir gesetzt... , die noch an der neuen position.Wie gesagt, es gibt drei Möglichkeiten, um damit umzugehen. Die erste ist, um eine Fertigstellung block auf die animation, um es rückgängig zu machen, etwa so:
Erste Option
Zweite Option
Die zweite option ist die autoreverse-die animation, wie Sie tun, und setzen Sie die Ansicht zurück zu seiner ursprünglichen position in eine Abschluss-block:
Jedoch, dies kann zu flackern zwischen der Zeit, die die animation autoreverse abgeschlossen, und bei den Abschluss-block ausgeführt, so dass es wahrscheinlich nicht Ihre beste Wahl.
Dritte Option
Die Letzte option ist, erstellen Sie einfach eine
CAAnimation
direkt. Wenn Sie nicht wirklich wollen, ändern Sie den letzten Wert der Eigenschaft Sie ändern, ist dies oft einfacher.Beachten Sie, dass die
CAAnimation
Weg, Dinge zu tun, die sich nie ändert die tatsächlichen Werte von den anzeigen, sondern einfach nur die Masken die tatsächlichen Werte mit einer animation. Den Blick immer noch denkt, dass es in die ursprüngliche Lage. (Das bedeutet zum Beispiel, dass wenn Sie Ihre anzeigen reagiert auf touch-events, es wird noch sein, gerade für diejenigen, die touch-events zu passieren, an den ursprünglichen Speicherort. Die animation nur ändert die Art, wie der Blick zieht; sonst nichts.Den
CAAnimation
Weg erfordert auch, dass Sie es hinzufügen, um die Ansicht zugrundeCALayer
. Wenn dies erschreckt Sie, fühlen Sie sich frei zu verwenden, die-[UIView animateWithDuration:…]
Methoden statt. Es gibt zusätzliche Funktionen zur Verfügung, indem SieCAAnimation
, aber wenn es etwas, das Sie nicht vertraut sind mit, Verkettung UIView-Animationen oder setzen Sie es in die Abschluss-block ist vollkommen akzeptabel. In der Tat, das ist eines der Hauptziele der Vollendung blockieren.So, dort gehen Sie. Drei verschiedene Wege umkehren einer animation und halten Sie die original-Wert. Genießen Sie!
someView.center = oldCenter;
? Nachdem die animation beendet ist, wird die view wird dann in Position zunewPoint
und gingen dann zurück zuoldCenter
sehr schnell, was zu einem unerwünschten "flash" - Effekt. Wissen Sie, wie Sie das vermeiden?Ich habe nicht einen test Bett bis auf den moment, aber es fällt mir auf, dass die Einstellung someView.center = oldCenter sofort nachdem dem Aufruf von
animateWithDuration...
könnte tatsächlich dieses Problem zu beheben. Und dann würden Sie nicht brauchen, die Abschluss-handler. Sie könnten versuchen, und lassen Sie mich wissen? Wenn es funktioniert, ich werde Bearbeiten Sie die Antwort.Wenn ich
someView.center = oldCenter;
direkt nach deranimateWithDuration:...
Methode die animation einfach nicht passieren. Beachten Sie, dass ich sah nur den unerwünschten Effekt, kommentierte oben ausgeführt, wenn die animation in einem Gerät (simulator die animation ging reibungslos).BTW, was zu animieren 1,5 x und machst den rest selber? Check meine Antwort.
Wunderbare, klare Erklärung. Sehr gut geschrieben (gewählt)
InformationsquelleAutor BJ Homer
Hier ist meine Lösung. Für 2x wiederholen, animieren, 1.5 x und die letzten 0,5 x Teil von sich selbst:
Kein blinken, arbeitet schön.
InformationsquelleAutor Rudolf Adamkovič
Es ist ein
repeatCount
Eigenschaft aufCAMediaTiming
. Ich denke, dass müssen Sie erstellen eine expliziteCAAnimation
Objekt, und konfigurieren Sie es richtig. Die repeatCount für wachsen und ungrow wäre 2, aber Sie können dies testen.Etwas lange die Linien. Benötigen Sie zwei CAAnimation Objekte ist allerdings für den Rahmen und eine für die rotation.
AFAIK gibt es keine Möglichkeit zu vermeiden, Programmierung zwei Animations-Objekte.
Vielen Dank für die Einsicht. Ich war nicht sicher, wie es gezählt wird.
InformationsquelleAutor GorillaPatch