2010-05-28 9 views

Respuesta

7

Es más o menos simple. Usted tiene un ivar CALayer *yourLayer. A continuación, establece el delegado y poner en práctica el método delegado -(id<CAAction>)actionForLayer:forKey:

- (void)awakeFromNib { 
    yourLayer.delegate = self; 
    yourLayer.name = @"yourLayer"; 
} 
- (id <CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event { 
    if([layer.name isEqualToString yourLayer.name]) { // Check for right layer 

     CABasicAnimation *ani = [CABasicAnimation animationWithKeyPath:event]; // Default Animation for 'event' 
     ani.duration = .5; // Your custom animation duration 
     return ani; 

    } else return nil; // Default Animation 
} 
10

Una forma diferente de hacer esto:

[CATransaction begin]; 
[CATransaction setValue:[NSNumber numberWithFloat:2.5f] forKey:kCATransactionAnimationDuration]; 
//Perform CALayer actions, such as changing the layer contents, position, whatever. 
aCALayerObject.contents = [self newCALayerContents];  
[CATransaction commit]; 

Ese código sería animar el cambio del contenido de la CALayer más de 2,5 segundos. También puede usar esto para desactivar completamente todas las animaciones. De esta manera:

[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; 
19

Sólo puede llamar a:

[CATransaction setAnimationDuration:durationSecs] 

en -layoutSublayers o cualquier otro lugar que se modifican las capas y esperar que animan de forma implícita. Esto afectará la transacción implícita actual y cualquier subtransacción dentro de esta.

+0

¿De dónde consigo el objeto 'CATransaction'? –

+0

'' 'CATransaction''' es una clase. '' 'setAnimationDuration: seconds''' es un método de clase. En este caso, establece la duración de la transacción actual. –

+0

Gracias, lo entiendo ahora. –

Cuestiones relacionadas