CILayer und implizite Animation

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

  • CILayer und implizite Animation

    Ok, ich weis gerade echt nicht weiter. Ich möchte einen CIFilter auf einem Layer animieren - allerdings implizit. Laut Doku ist das möglich:

    developer.apple.com/library/io…occ/instp/CALayer/filters

    Die Modifikation des Layers ist nur erlaubt bei Layer-Hosted View, daher:

    Quellcode

    1. - (void)awakeFromNib {
    2. ...
    3. // logoImageView == NSImageView
    4. CALayer* hostedLayer = [CALayer layer];
    5. hostedLayer.contents = [NSImage imageNamed:@"myImage"];
    6. // Setup the filter
    7. CIFilter *filter = [CIFilter filterWithName:@"CITwirlDistortion"];
    8. [filter setDefaults];
    9. [filter setName:@"bobby"];
    10. hostedLayer.filters = @[filter];
    11. [self.logoImageView setLayer:hostedLayer];
    12. [self.logoImageView setWantsLayer:YES];
    13. }
    Alles anzeigen


    Soweit so gut, allerdings wird weder die Animation durchgeführt noch der Parameter geändert:

    Quellcode

    1. - (void)doAnimation {
    2. [[self.logoImageView layer] setValue:@(55.0) forKey:@"filters.bobby.inputRadius"];
    3. }


    Irgendwelche Ideen?

    Die Stelle, an welcher mein Gehirn dann komplett das Verständnis einstellt kommt jetzt. Folgender Code führt die Animation aus:

    Quellcode

    1. - (void)doAnimation {
    2. CIFilter *filter = [CIFilter filterWithName:@"CITwirlDistortion"];
    3. [filter setDefaults];
    4. [filter setValue:@(1) forKey:@"inputRadius"]; // <-- Dieser Wert wird für die Animation verwendet: 1
    5. [filter setName:@"bobby"];
    6. [self.logoImageView layer].filters = @[filter];
    7. [[self.logoImageView layer] setValue:@(55.0) forKey:@"filters.bobby.inputRadius"]; // <-- Dieser Wert wird NICHT verwendet: 55 - fehlt dieses Statement wird überhaupt keine Animation durchgeführt.
    8. }


    Sollte es nicht möglich sein den bereits gesetzten Filter zu verwenden? Irgendwie ist das doch Murks...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von paxos ()

  • Wo steht denn, dass die Filter implizit animiert werden?

    In jedem Fall funktioniert das folgende:

    Quellcode

    1. - (void)doAnimation {
    2. CGFloat fromValue = [[catLayer valueForKeyPath:@"filters.bobby.inputRadius"] floatValue];
    3. CGFloat toValue = 30.0;
    4. CGFloat duration = 3.0; // secs
    5. [catLayer setValue:@(toValue) forKeyPath:@"filters.bobby.inputRadius"];
    6. CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"filters.bobby.inputRadius"];
    7. animation.fromValue = @(fromValue);
    8. animation.toValue = @(toValue);
    9. animation.duration = duration;
    10. [catLayer addAnimation:animation forKey:nil];
    11. }
    Alles anzeigen
  • Das Zitat klingt für mich so, als ob es aus dem Pflichtenheft in die Dokumentation kopiert wurde, aber nicht wirklich umgesetzt ist. Sieht man bei Apple leider immer wieder…

    Edit:
    Eine etwas optimistischere Interpretation wäre, dass mit dem Satz
    Sub-properties of the filters are animated using the default implied CABasicAnimation object, […].

    nur die Eigenschaften gemeint sind, welche weiter unten bei "CIFilter Animatable Properties" beschrieben sind.

    So oder so: Wenn es nicht tut, dann beiß Dir daran nicht die Zähne aus. Die Dokumentation deckt sich manchmal einfach nicht mit der Umsetzung. Benutzer des OpenCL- oder Addressbook-Frameworks wissen vermutlich was ich meine.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von ccll1 ()