Frage zu CoreAnimation

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

  • Frage zu CoreAnimation

    Hey,
    ich habe mit CoreAnimation gearbeitet und versuche, auf den View eines Fensters einen Filter zu legen und ein Parameter dessen zu animieren.
    Das sieht dann so aus:

    Quellcode

    1. - (IBAction)action:(id)sender
    2. {
    3. CALayer *layer = [CALayer layer];
    4. CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
    5. [filter setDefaults];
    6. [filter setValue:[NSNumber numberWithFloat:0] forKey:@"inputRadius"];
    7. [filter setName:@"blurFilter"];
    8. [layer setFilters:[NSArray arrayWithObjects:filter,nil]];
    9. [[window contentView] setWantsLayer:YES];
    10. [[window contentView] setLayer:layer];
    11. CABasicAnimation* animation = [CABasicAnimation animation];
    12. animation.keyPath = @"filters.blurFilter.inputRadius";
    13. animation.fromValue = [NSNumber numberWithFloat: 0.0];
    14. animation.toValue = [NSNumber numberWithFloat: 2.0];
    15. animation.duration = 1.0;
    16. [layer addAnimation:animation forKey:@"animation"];
    17. }
    Alles anzeigen


    Der Filter funktioniert prima, aber wenn action: aufgerufen wird, passiert häufig einfach gar nichts. Und wenn es mal animiert, ist inputRadius nach der Animation wieder auf 0. Muss ich den "manuell" nach der Animation auf 2.0 setzen, damit es im Endstand der Animation bleibt?
    Ich habe das jetzt auf den contentView des Fensters gemacht. Gibt es eine Möglichkeit, die Filter/Animationen auf das ganze Fenster zu legen?
    Würde mich freuen, wenn jemand Zeit hätte, kurz auf den Code zu schauen!
    Osxer
  • Osxer schrieb:

    Der Filter funktioniert prima, aber wenn action: aufgerufen wird, passiert häufig einfach gar nichts. Und wenn es mal animiert, ist inputRadius nach der Animation wieder auf 0. Muss ich den "manuell" nach der Animation auf 2.0 setzen, damit es im Endstand der Animation bleibt?

    Nein, Du musst ihn davor auf den Endwert setzen.
    „Meine Komplikation hatte eine Komplikation.“
  • Ich kenne mich mit Core Animation unter OSX nicht so aus. Mein heißester Kandidat wäre der setWantsLayer:-Aufruf in der Methode. Meines Erachtens sollte das nicht im gleichen Runloop-Durchlauf wie der Animationsstart erfolgen. Du solltest das mal lieber direkt nach dem Laden des Views machen. Wenn ich die Doku richtig verstehe, brauchst Du den Layer auch nicht explizit zu setzen.
    „Meine Komplikation hatte eine Komplikation.“