31 votes

L'animation d'une propriété personnalisée de CALayer sous-classe

J'ai un CALayer sous-classe, MyLayer, qui a un NSInteger propriété appelée myInt. Je tiens vraiment à les animer cette propriété via CABasicAnimation, mais il semble CABasicAnimation ne fonctionne que sur les soi-disant "animables" propriétés (limites, position, etc). Est-il quelque chose que je peux remplacer pour faire ma personnalisé myInt propriété animables?

70voto

Ole Begemann Points 85798

Oui, c'est possible (seulement dans le dernier Core Animation communiqués de bien, je crois, c'est à dire l'iPhone 3.0+ et OS X 10.6+).

  1. Faire de votre propriété dynamique pour que CA met en œuvre les accesseurs pour vous:

    @dynamic myInt;
    
  2. Dire la couche que les changements de la propriété besoin de redessiner:

    + (BOOL)needsDisplayForKey:(NSString*)key {
        if ([key isEqualToString:@"myInt"]) {
            return YES;
        } else {
            return [super needsDisplayForKey:key];
        }
    }
    
  3. Utiliser la valeur de myInt votre drawInContext: méthode. Maintenant, lorsque vous animez myInt, Core Animation d'interpoler les valeurs pour chaque étape de l'animation et de demander à plusieurs reprises de la couche à tracer lui-même.

  4. Si vous aussi vous souhaitez activer implicite des animations pour cette propriété, également remplacer actionForKey:.

6voto

Ash Points 41

Il est un moyen de conserver les iVars de votre personnalisé CALayer sous-classes. Vous remplacez initWithLayer:, la méthode qui est appelée pour créer une copie de la coutume couches. Par exemple, si vous avez un calque dans lequel vous souhaitez créer une propriété personnalisée appelé "angle", vous pouvez utiliser le code suivant:

@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;
}

Et bob est votre oncle! Notez que vous ne pouvez pas utiliser cet objet implicite de l'animation, pour lequel il faudrait aussi annuler la actionForKey: la méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X