Animowanie właściwości niestandardowej podklasy cala

Mam podklasę CALayer, MyLayer, która ma właściwość nsinteger o nazwie myInt. Naprawdę chciałbym animować tę właściwość za pomocą CABasicAnimation, ale wygląda na to, że CABasicAnimation działa tylko na tak zwanych "animowanych" właściwościach (granice, położenie itp.). Czy jest coś, co mogę zastąpić, aby moja niestandardowa właściwość myInt mogła być animowana?

Author: jemmons, 2010-03-07

2 answers

Tak, to możliwe (tylko w najnowszych wydaniach Core Animation, jak sądzę, tj. iPhone 3.0+ i OS X 10.6+).

  1. Spraw, aby Twoja nieruchomość była dynamiczna, aby CA implementowała dla Ciebie accessory:

    @dynamic myInt;
    
  2. Powiedz warstwie, że zmiany właściwości wymagają przerysowania:

    + (BOOL)needsDisplayForKey:(NSString*)key {
        if ([key isEqualToString:@"myInt"]) {
            return YES;
        } else {
            return [super needsDisplayForKey:key];
        }
    }
    
  3. Użyj wartości myInt w swojej metodzie drawInContext:. Teraz, gdy animujesz myInt, Core Animation będzie interpolować wartości dla każdego kroku animacji i wielokrotnie poproś warstwę, aby narysowała się sama.

  4. Jeśli chcesz również włączyć domyślne animacje dla tej właściwości, Nadpisz actionForKey:.

 68
Author: Ole Begemann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-22 16:52:03

Istnieje jest sposób, aby zachować Ivary swoich niestandardowych podklas CALayer. Nadpisujesz metodę initWithLayer:, która jest wywoływana do tworzenia kopii warstw niestandardowych. Na przykład, jeśli masz warstwę, w której chcesz utworzyć właściwość niestandardową o nazwie 'angle', możesz użyć następującego kodu:

@implementation AngledLayer
@synthesize angle = _angle

// Tell Core Animation that this key should be animated
+ (BOOL) needsDisplayForKey:(NSString *)key
{
    if ([key isEqualToString:@"angle"]) return YES;
    return [super needsDisplayForKey:key];
}


// Make sure that, when the layer is copied, so is the custom ivar
- (id) initWithLayer:(id)layer
{
    self = [super initWithLayer:layer];
    if (self) {
        AngledLayer *angledVersion = (AngledLayer *)layer;
        self.angle = angledVersion.angle;
    }
    return self;
}
A bob jest Twoim wujkiem! Zauważ, że nie możesz używać tego obiektu z ukrytą animacją, w przypadku której musisz również zastąpić metodę actionForKey:.
 6
Author: Ash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-09 20:44:47