Iphone 如何防止CALayer隐式动画?

Iphone 如何防止CALayer隐式动画?,iphone,calayer,Iphone,Calayer,当我设置CALayer实例的backgroundColor属性时,更改似乎有点动态化。但我不想在我的情况下这样。如何在没有动画的情况下设置backgroundColor?您可以在禁用动画的CATransaction中包装更改: [CATransaction begin]; [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; //change background colour [CATr

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

您可以在禁用动画的
CATransaction
中包装更改:

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

尝试为您的图层指定一个
委托
,然后让
委托
实施:

- (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)key {
    return [NSNull null];
}
-(id)actionForLayer:(CALayer*)层forKey:(NSString*)键{
返回[NSNull];
}
目标C:

[CATransaction begin];
[CATransaction setDisableActions:YES];
// your code here        
[CATransaction commit];
斯威夫特:

CATransaction.begin()
CATransaction.setDisableActions(true)

// your code here        
CATransaction.commit()

如果要完全禁用特性的隐式动画,可以通过指定给
操作
字典:

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

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

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

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

# Example usage:
withoutCAAnimations { layer.backgroundColor = greenColor; }
在swift中的层上停止隐式动画: 记住将CALayer实例的委托设置为至少扩展NSObject的类的实例。在本例中,我们扩展了NSView。

Swift

这里已经有了几个快速的答案,但我认为这是最基本的答案:

CATransaction.begin()
CATransaction.setDisableActions(true)

// change the layer's background color

CATransaction.commit()

有没有办法在CALayer中为将来的每个属性设置完全禁用它?我正在更改一些属性,比如每秒20次…我认为您必须将更改打包到这些块中,以停止隐式动画。我相信有一种方法可以通过将CALayer的delegate更改为nil来阻止它们,但我不确定该方法是否有效。请注意,对于任何未来的观众来说:发布的答案提供了比这一个更好的性能。这两个备选方案做了不同的事情。事务将暂时禁用所有影响动画。将NSNull添加到操作字典将永久禁用该键路径的隐式动画(或直到字典更改)。两种解决方案都不比另一种“简单”。它们只适用于两种不同的情况。明确地说,对于这个问题,这确实更简单,因为实际目标是永久禁用动画(请参见顶部答案的注释)。由于这两种解决方案都有效(要么总是用
CATransaction
来关闭它们,要么简单地分配
actions
字典),我认为我提出的方案实际上更简单。是的,但措辞让它听起来更简单。我只是想提供更多的信息,比较这两个选项。@DavidRönnqvist好的,我改变了语言,提到了这两个选项以避免混淆。的可能重复
CATransaction.begin()
CATransaction.setDisableActions(true)

// change the layer's background color

CATransaction.commit()