2013-08-17 15 views
5

Ho una sottoclasse CALayer con float animAngle come proprietà contrassegnata come @dynamic. Ho implementato i metodi actionForKey, initWithLayer, needsDisplayForKey e drawInContext per la sottoclasse. La definizione di actionForKey è la seguenteSottoclasse CALayer che non si anima alle modifiche delle proprietà

- (id<CAAction>)actionForKey:(NString *)event { 
    if([event isEqualToString:@"animAngle"]) { 
     return [self animationForKey:event]; 
    } 
    return [super actionForKey:event]; 
} 

E

- (CABasicAnimation *)animationForKey:(NSString *)key 
{ 
    NSString *animValue = [[self presentationLayer] valueForKey:key];// Logs as 0 
    CABasicAnimation *anim; 

    if([key isEqualToString:@"animAngle"]) { 
     anim = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
     anim.repeatCount = HUGE_VAL; 
     anim.autoreverses = YES; 
     //anim.fromValue = [[self presentationLayer] valueForKey:key]; // setting animation value from layer property as in here does not work. 
     anim.fromValue = [NSNumber numberWithFloat:0.5f];   // This works 
    } 
    anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
    anim.duration = 0.11; 
    return anim; 
} 

In someother classe:

myCASublayer.animAngle = 0.5f; 

In qualche modo il CABasicAnimation viene restituito non è in grado di utilizzare correttamente il livello "animAngle" proprietà. Cosa potrei fare di sbagliato qui?

+0

Uno si chiama 'animAngle' l'altro è' wiggleAngle' –

+0

@RobvanderVeer: Mi dispiace che è stato un errore di battitura. Il suo animAngle. – rawatm

+0

@ basstrekerk87, meglio copiare/incollare la volta successiva, salva errori! Sai che in realtà non devi indentare il codice manualmente? Utilizzare il pulsante o iniziare con 3 backquote (') –

risposta

1

CocoaHeads Session: Rob Napier on Animating Custom Layer Properties è una buona presentazione di animazioni personalizzate.

CALayers odiano non disegnare;)

+0

grazie, funziona. ma se l'animazione è infinita in numero di ripetizioni, dà solo una volta gli animi. DrawInContext non è chiamato per le animazioni ripetute? – rawatm

+0

@ basstrekker87 Non sono sicuro che l'azione per il tasto possa supportare la ripetizione. AFAIK è più o meno un'animazione implicita da un vecchio valore a un nuovo valore. –

+0

sì che potrebbe essere il caso in cui CALAYers odia disegnare :-) – rawatm

1

Se animAngle è un @property - è necessario specificare accessors per questa proprietà.
Quando si contrassegna la proprietà come @dynamic, ciò significa che verrà fornita un'implementazione di tali metodi dinamicamente in fase di esecuzione. Quindi, se non si forniscono accessor per la proprietà, non è possibile accedervi.

+0

ha provato a creare accessors per animAngle ma ancora non funziona. @dynamic è richiesto per le sottoclassi CALayer che forniscono implementazioni per la proprietà stessa, ma le modifiche di anyhows non vengono ancora aggiornate – rawatm

+0

Questo non è proprio vero per i CALayer. Sono ... "speciali";) –

+0

@ DavidRönnqvist: Che cosa è falso. la risposta di Lexandr o il commento che ho aggiunto. – rawatm

Problemi correlati