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?
Réponses
Trop de publicités?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+).
-
Faire de votre propriété dynamique pour que CA met en œuvre les accesseurs pour vous:
@dynamic myInt;
-
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]; } }
Utiliser la valeur de
myInt
votredrawInContext:
méthode. Maintenant, lorsque vous animezmyInt
, Core Animation d'interpoler les valeurs pour chaque étape de l'animation et de demander à plusieurs reprises de la couche à tracer lui-même.Si vous aussi vous souhaitez activer implicite des animations pour cette propriété, également remplacer
actionForKey:
.
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.