2010-05-28 7 views

Répondre

7

C'est plus ou moins simple. Vous avez un ivar CALayer *yourLayer. Ensuite, vous définissez le délégué et mettre en œuvre la méthode déléguée -(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

Une autre façon de le faire:

[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]; 

Ce code serait animer le changement du contenu du CALayer plus de 2,5 secondes. Vous pouvez également l'utiliser pour désactiver complètement toutes les animations. Comme ceci:

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

Vous pouvez simplement appeler:

[CATransaction setAnimationDuration:durationSecs] 

dans -layoutSublayers ou nulle part ailleurs que vous modifiez les couches et attendre à ce qu'ils animent implicitement. Cela affectera la transaction implicite actuelle et toutes les sous-transactions dans celle-ci.

+0

D'où puis-je obtenir l'objet 'CATransaction'? –

+0

'' 'CATransaction''' est une classe. '' 'setAnimationDuration: seconds''' est une méthode de classe. Dans ce cas, il définit la durée de la transaction en cours. –

+0

Merci, je l'ai maintenant. –

Questions connexes