I have a CALayer to animate a change in its image contents. Now, how can I change how long it takes for this animation to take place?
                +2 
                A: 
                
                
              
            It's more or less simple. You have an ivar CALayer *yourLayer. Then you set the delegate and implement the delegate method -(id)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
}
                  papr
                   2010-05-28 05:52:32
                
              
                +1 
                A: 
                
                
              
            A different way to do this:
[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];
That code would animate the change of the CALayer's contents over 2.5 seconds. You can also use this to disable all animations completely. Like this:
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
                  Charliehorse
                   2010-06-01 13:17:21