2010-05-28 8 views

Antwort

7

Es ist mehr oder weniger einfach. Sie haben einen ivar CALayer *yourLayer. Dann setzen Sie die Delegaten und implementieren die delegierte Methode -(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

Eine andere Art und Weise, dies zu tun:

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

Dieser Code die Änderung des CALayer Inhalts über 2,5 Sekunden animieren würde. Sie können damit auch alle Animationen komplett deaktivieren. Wie folgt aus:

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

können Sie rufen:

[CATransaction setAnimationDuration:durationSecs] 

in -layoutSublayers oder anderswo, dass man die Schichten ändern und erwarten, dass sie implizit animieren. Dies wirkt sich auf die aktuelle implizite Transaktion und alle Untertransaktionen innerhalb dieser Transaktion aus.

+0

Woher bekomme ich das CATransaction-Objekt? –

+0

'' 'CATransaction''' ist eine Klasse. '' 'setAnimationDuration: Sekunden''' ist eine Klassenmethode. In diesem Fall wird die Dauer für die aktuelle Transaktion festgelegt. –

+0

Danke, ich verstehe es jetzt. –