Изменить время анимации для свойств CALayer
У меня есть CALayer для анимации изменений в содержании его изображения. Теперь, как я могу изменить время, необходимое для анимации?
3 ответа
Решение
Это более или менее просто. У вас есть ивар 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
}
Вы можете просто позвонить:
[CATransaction setAnimationDuration:durationSecs]
в -layoutSublayers или в любом другом месте, где вы изменяете слои и ожидаете, что они неявно анимируются. Это повлияет на текущую неявную транзакцию и любые суб-транзакции в этой.
Другой способ сделать это:
[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];