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()