Animationsdauer in Core Animation ermitteln

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Animationsdauer in Core Animation ermitteln

    Ich starte innerhalb eines Animationsblocks eine CAAnimation, also ungefähr so:

    Quellcode

    1. CALayer *theLayer = ...;
    2. void (^theAnimation)(void) = ^{
    3. CABasicAnimation *theAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.x"];
    4. theAnimation.toValue = [NSNumber numberWithFloat:M_PI / 4.0];
    5. theAnimation.duration = ???;
    6. [theLayer addAnimation:theAnimation forKey:nil];
    7. ...
    8. };
    9. [UIView animateWithDuration:0.5 animations:theAnimation];
    Alles anzeigen

    Die Dauer der CABasicAnimation möchte ich in Abhängigkeit der Dauer des Parameters duration von animateWithDuration:animations: setzen.

    Wie kann ich diese Zeit, also im Beispiel die 0.5 Sekunden, im Animationsblock ermitteln?
    „Meine Komplikation hatte eine Komplikation.“
  • scriptedSheep schrieb:

    Ohne all zu viel Ahnung davon zu haben: Eigene Methode schreiben, der du den Wert übergibst und die dir dann den Block irgendwie zurückliefert? Ne Instanzvariable wird es da ja vermutlich eher nicht geben :D

    Danke für Deine Antwort. Aber das möchte ich nicht machen. Dazu müsste ich die Animationsdauer ja beim Anlegen des Blocks kennen oder beim Starten der Animation müsste ich wissen, dass der Block eine verschachtelte Animation enthält.
    „Meine Komplikation hatte eine Komplikation.“
  • scriptedSheep schrieb:

    Wenn du das Verhalten zumindest im groben haben willst kommst du wahrscheinlich nicht drum rum, wie gesagt, die Chancen das es da ne Property oder ähnliches gibt gehen gegen null :)

    Wie ich Dir bereits geschrieben habe, kommt diese Lösung nicht in Frage.

    Eine andere Lösung habe ich bereits gefunden: Ich lese einfach die Zeit aus einer anderen Animation aus, die in dem Block erzeugt wird. Da die automatisch erzeugten Animationen diese Zeit auslesen können, muss aber noch einen anderen Weg geben. Naja, wahrscheinlich steht da aber No Trespassing dran ;)
    „Meine Komplikation hatte eine Komplikation.“
  • Ist es keine Option eine Klasse AnimView von UIView zu machen, dort das animateWithDuration zu überschreiben und den Wert im Appdelegate zu speichern bzw in einer Methode +(float)getAnimationDuration() dann wieder auszulesen.

    Sicher nicht soo schön aber funktionell.

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    Ist es keine Option eine Klasse AnimView von UIView zu machen, dort das animateWithDuration zu überschreiben und den Wert im Appdelegate zu speichern bzw in einer Methode +(float)getAnimationDuration() dann wieder auszulesen.

    Danke für Deine Antwort. Die Idee ist nicht so schlecht. Allerdings würde ich es mit einer Kategorie machen und die Animationsmethoden des Views verbiegen. Außerdem muss die Dauer in einem Stack gespeichert werden, da Animationen ja verschachtelt sein können. Ich denke da mal drüber nach.

    EDIT: Im Prinzip läuft das ja auf eine AOP-Lösung raus.
    „Meine Komplikation hatte eine Komplikation.“
  • Du schreibst eine Methode, die die Dauer als Parameter bekommt:

    Quellcode

    1. - (Block)animationsWithDuration:(NSTimeInterval)duration
    2. CALayer *theLayer = ...;
    3. void (^theAnimation)(void) = ^{
    4. CABasicAnimation *theAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.x"];
    5. theAnimation.toValue = [NSNumber numberWithFloat:M_PI / 4.0];
    6. theAnimation.duration = duration;
    7. [theLayer addAnimation:theAnimation forKey:nil];
    8. return [[theAnimation copy] autorelease];
    9. };
    Alles anzeigen


    Aber das Ganze ist von hinten durch die Brust ins Auge.

    Blöcke sind dazu da, dass sie ihren Erzeugungskontext merken. Genau das willst du nicht. Du willst das später parametrisieren. Da stellt sich die Frage, ob du nicht einfach eine Methode nehmen solltest anstelle von Blocks.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    Aber das Ganze ist von hinten durch die Brust ins Auge.

    Ich will den Block anlegen können, ohne die Animationsdauer zu kennen. Wenn ich nur die Animationstechniken des UIKits ohne explizite CA-Animations verwende, klappt das ja auch ohne Probleme.

    Amin Negm-Awad schrieb:

    Blöcke sind dazu da, dass sie ihren Erzeugungskontext merken. Genau das willst du nicht. Du willst das später parametrisieren. Da stellt sich die Frage, ob du nicht einfach eine Methode nehmen solltest anstelle von Blocks.

    Core Animation bekommt die Animationsdauer ja auch ohne zusätzliche Variable raus, denn ein Animationsblock legt sticknormale CAAnimation-Objekte im Layer des Views an.

    Darauf beruht ja auch meine Behelfslösung. Ich suche lediglich nach einem offiziellen Weg, diese Zeit zu ermitteln. Es geht nicht um einen generellen Weg, Zahlen nachträglich in einen Block zu fummeln.
    „Meine Komplikation hatte eine Komplikation.“
  • Du erstehst mich nicht. Animationsirgendwas kann machen was es will. Meinetwegen geht es um eine Toilettenpapiersteuerung.

    Das ändert sich nichts daran:
    "Blöcke sind dazu da, dass sie ihren Erzeugungskontext merken. Genau das willst du nicht. Du willst das später parametrisieren. Da stellt sich die Frage, ob du nicht einfach eine Methode nehmen solltest anstelle von Blocks."

    Du machst mit voller Absicht eine Photographie zu einer Erzeugungssituation, um dich dann später darüber zu beklagen, dass diese die Erzeugungssituation zeigt und die entscheidende Information erst später im Motiv erscheint.

    WTF machst du ein Photo?
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    Das ändert sich nichts daran:
    "Blöcke sind dazu da, dass sie ihren Erzeugungskontext merken. Genau das willst du nicht. Du willst das später parametrisieren. Da stellt sich die Frage, ob du nicht einfach eine Methode nehmen solltest anstelle von Blocks."

    Das habe ich ja nicht zuletzt durch Deinen Macoun-Vortrag verstanden. Da habe ich ja auch nichts gegen. Ich bin auch kein Fan von Klassenmethoden und statischen Variablen.

    Es geht in diesem Thread aber aber nicht um Blöcke sondern um Core Animation. Leider gibt Apple das mit der Dauer so vor. Beispiel:

    Quellcode

    1. [UIView animateWithDuration:2.0 animations:^{
    2. theView.alpha = 1.0;
    3. }

    Das UIKit und Core Animation erzeugen für die Anweisung im Block eine CABasicAnimation mit dem Key-Path opacity und der Dauer 2.0. Die kommen also auch an die Dauer dran.
    „Meine Komplikation hatte eine Komplikation.“
  • Es gibt zwei grundlegende vorgehen für Animationen: developer.apple.com/library/io…/uid/TP40006816-CH3-SW108
    Animationen ohne Blöcke sind discouraged. Aber wie geschrieben. Es geht hier nicht um Blöcke. Ich will an die Animationsdauer kommen. Der Code dazu muss noch nicht mal direkt im Block stehen. Der kann auch in einer Methode stehen, die aus dem Block heraus aufgerufen wird - oder noch tiefer verschachtelt sein.

    EDIT: Im Prinzip brauche ich das Gegenstück zu setAnimationDuration: von den Nicht-Block-Animationen.
    „Meine Komplikation hatte eine Komplikation.“