2010-05-28 3 views

ответ

7

Это более-менее простое. У вас есть ivar CALayer *yourLayer. Затем установить делегат и реализовать метод делегат -(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

Другой способ сделать это:

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

Этот код будет анимировать изменение содержимого CALayer в течение 2,5 секунд. Вы также можете использовать это, чтобы полностью отключить все анимации. Как это:

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

Вы можете просто позвонить:

[CATransaction setAnimationDuration:durationSecs] 

в -layoutSublayers или где-либо еще, что вы изменяете слои и ожидать, что они неявно анимировать. Это будет влиять на текущую неявную транзакцию и любые суб-транзакции внутри этого.

+0

Где я могу получить объект 'CATransaction'? –

+0

'' 'CATransaction''' - это класс. '' 'setAnimationDuration: seconds''' - метод класса. В этом случае устанавливается длительность текущей транзакции. –

+0

Спасибо, я понял. –

Смежные вопросы