Ответ 1
Вы можете обернуть изменение в CATransaction
с отключенной анимацией:
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
//change background colour
[CATransaction commit];
Когда я устанавливаю свойство backgroundColor
экземпляра CALayer
, это изменение кажется слегка анимированным. Но я не хочу этого в моем случае. Как установить backgroundColor
без анимации?
Вы можете обернуть изменение в CATransaction
с отключенной анимацией:
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
//change background colour
[CATransaction commit];
[CATransaction begin];
[CATransaction setDisableActions:YES];
//your code here
[CATransaction commit];
Попробуйте дать свой слой delegate
, а затем реализовать delegate
:
- (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)key {
return [NSNull null];
}
Swift
Уже есть пара других ответов Swift, но я думаю, что это самый простой ответ:
CATransaction.begin()
CATransaction.setDisableActions(true)
// change the layer background color
CATransaction.commit()
Если вы хотите полностью отключить неявные анимации для свойства, вы можете сделать это, назначив словарь actions
:
myLayer.actions = @{@"backgroundColor": [NSNull null]};
Если вы хотите отключить неявную анимацию в каждом конкретном случае, использование [CATransaction setDisableActions:YES]
по-прежнему является лучшим способом сделать это.
Я взял ответ Ben и сделал функцию помощника Swift, вот он на случай, если он будет полезен для всех:
func withoutCAAnimations(closure: () -> ()) {
CATransaction.begin()
CATransaction.setValue(kCFBooleanTrue, forKey: kCATransactionDisableActions)
closure()
CATransaction.commit()
}
# Example usage:
withoutCAAnimations { layer.backgroundColor = greenColor; }
override func actionForLayer(layer: CALayer, forKey event: String) -> CAAction? {
return NSNull()
}
Не забудьте указать делегат вашего экземпляра CALayer экземпляру класса, который по крайней мере расширяет NSObject. В этом примере мы расширяем NSView.