如何防止CALayer隐式动画?

时间:2010-10-07 17:33:52

标签: iphone calayer

当我设置backgroundColor实例的CALayer属性时,更改似乎略有动画。但在我的情况下,我不希望这样。如何在没有动画的情况下设置backgroundColor

6 个答案:

答案 0 :(得分:34)

您可以将更改包含在已禁用动画的CATransaction中:

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

答案 1 :(得分:12)

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

答案 2 :(得分:9)

<强>夫特

此处还有其他一些Swift答案,但我认为这是最基本的答案:

CATransaction.begin()
CATransaction.setDisableActions(true)

// change the layer's background color

CATransaction.commit()

答案 3 :(得分:8)

尝试为您的图层delegate提供一个delegate工具:

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

答案 4 :(得分:2)

如果要完全禁用属性的隐式动画,可以通过分配actions字典来实现:

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

如果您希望根据具体情况禁用隐式动画,那么使用[CATransaction setDisableActions:YES]仍然是更好的方法。

答案 5 :(得分:1)

我已经接受了Ben的回答并制作了一个Swift辅助函数,以防万一它对任何人都有用:

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

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