Как предотвратить CALayer от неявной анимации?

Когда я устанавливаю свойство backgroundColor экземпляра CALayer, это изменение кажется слегка анимированным. Но я не хочу этого в моем случае. Как установить backgroundColor без анимации?

Ответы

Ответ 1

Вы можете обернуть изменение в CATransaction с отключенной анимацией:

[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
//change background colour
[CATransaction commit];

Ответ 2

[CATransaction begin];
[CATransaction setDisableActions:YES];
//your code here        
[CATransaction commit];

Ответ 3

Попробуйте дать свой слой delegate, а затем реализовать delegate:

- (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)key {
    return [NSNull null];
}

Ответ 4

Swift

Уже есть пара других ответов Swift, но я думаю, что это самый простой ответ:

CATransaction.begin()
CATransaction.setDisableActions(true)

// change the layer background color

CATransaction.commit()

Ответ 5

Если вы хотите полностью отключить неявные анимации для свойства, вы можете сделать это, назначив словарь actions:

myLayer.actions = @{@"backgroundColor": [NSNull null]};

Если вы хотите отключить неявную анимацию в каждом конкретном случае, использование [CATransaction setDisableActions:YES] по-прежнему является лучшим способом сделать это.

Ответ 6

Я взял ответ Ben и сделал функцию помощника Swift, вот он на случай, если он будет полезен для всех:

func withoutCAAnimations(closure: () -> ()) {
    CATransaction.begin()
    CATransaction.setValue(kCFBooleanTrue, forKey: kCATransactionDisableActions)
    closure()
    CATransaction.commit()
}

# Example usage:
withoutCAAnimations { layer.backgroundColor = greenColor; }

Ответ 7

Остановить неявную анимацию на слое в swift:

override func actionForLayer(layer: CALayer, forKey event: String) -> CAAction? {
    return NSNull()
}

Не забудьте указать делегат вашего экземпляра CALayer экземпляру класса, который по крайней мере расширяет NSObject. В этом примере мы расширяем NSView.