Kurze Verständnisfrage zu CABasicAnimation

  • Kurze Verständnisfrage zu CABasicAnimation

    Hi Leute,

    ich bin noch sehr neu auf dem Gebiet der Animationen und habe eine konzeptionelle Frage.

    Nach einer bestimmten Aktion wird mein UI mittels CABasicAnimations verändert, unter anderem so:

    Quellcode

    1. CABasicAnimation *animUser = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"];
    2. [animUser setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
    3. [animUser setFromValue:[NSNumber numberWithFloat:0]];
    4. [animUser setToValue:[NSNumber numberWithFloat:-60]];
    5. [animUser setAutoreverses:NO];
    6. [animUser setDuration:1.0];
    7. [animUser setRemovedOnCompletion:NO];
    8. [animUser setFillMode:kCAFillModeForwards];
    9. [[[self userColorTongueLabel] layer] addAnimation:animUser forKey:@"growingTongueUser"];


    Ich will nun die ursprüngliche UI wiederherstellen (in dem oberen Beispiel die Y-Position) und das ganze auch noch animiert. Wenn ich einfach nur removeAllAnimations bzw. removeAnimationForKey verwende, dann geschieht das sprunghaft.

    So wie ich das verstehe, ist die Animation ja (dank setRemovedOnCompletion:NO) noch in dem Layer. Sollte man nun die Animationsparameter verändern und dann die Animation wieder "starten"? Oder gibt es zufällig einen Trick, wie man die Animation einfach rückwärts abspielt und dann entfernt?

    Ich habe bisher nicht herausgefunden wie das funktionieren soll, bzw. bin mir unsicher, ob das überhaupt die richtige herangehensweise ist ;)

    PS. ich kann ja die Animation im Nachhinein nicht mehr ändern, ich bekomme Read-Only-Exceptions…
  • Zum Rückwärtsabspielen kannst Du einfach autoreverses auf YES setzen. Damit das nur einmal passiert, solltest Du für den repeatCount dern Wert 1 verwenden. Ich würde Animationen immer so verwenden, dass sie nach der Animation aus dem Layer entfernt werden. Abgelaufene Animationen im Layer haben teilweise unerwartete Nebenwirkungen.
    „Meine Komplikation hatte eine Komplikation.“
  • Das Problem ist nur, dass ich möchte, dass die Animation mitten drin stehenbleibt, bis wieder ein Ereignis eintritt. Also eigentlich eine Pause beim "Reverse-Punkt".

    Im Beispiel oben soll das heißen: UILabel soll 60px nach oben verschoben werden (animiert) und erst einmal dort verweilen, bis irgendein Ereignis eintritt -> dann wieder zurück (60px nach unten).
    Kann man das auch mit dem AutoReverse irgendwie lösen?
  • tamasgal schrieb:

    Das Problem ist nur, dass ich möchte, dass die Animation mitten drin stehenbleibt, bis wieder ein Ereignis eintritt. Also eigentlich eine Pause beim "Reverse-Punkt".

    Auch Pausen sind kein Problem. Die kannst Du über speed realisieren. Allerdings musst Du dazu ein paar Zeitrechnereien durchführen. Hier ist ein Beispiel dazu: openbook.galileocomputing.de/a…e8-4280-a5b4-4902011bc879
    „Meine Komplikation hatte eine Komplikation.“