Изменить время анимации для свойств CALayer

У меня есть CALayer для анимации изменения содержимого изображения. Теперь, как я могу изменить продолжительность этой анимации?


person Alexsander Akers    schedule 28.05.2010    source источник


Ответы (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
}
person papr    schedule 28.05.2010

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

[CATransaction setAnimationDuration:durationSecs] 

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

person Ben Lachman    schedule 19.11.2010
comment
Откуда я могу получить объект CATransaction? - person Luke Taylor; 09.07.2016
comment
CATransaction — это класс. setAnimationDuration:seconds — это метод класса. В этом случае он устанавливает продолжительность текущей транзакции. - person Ben Lachman; 11.07.2016
comment
Спасибо, теперь я понял. - person Luke Taylor; 11.07.2016

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

[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];
person Charliehorse    schedule 01.06.2010