如何立即移动一个 CALayer (没有动画)

我正试图在一个 iOS 应用程序中拖动一个 CALayer

只要我改变它的位置属性,它就会尝试动画到新的位置,并且到处闪烁:

 layer.position = CGPointMake(x, y)

我怎样才能立即移动 CALayers? 我似乎无法理解核心动画 API。

22391 次浏览

您想用以下方式结束通话:

[CATransaction begin];
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
layer.position = CGPointMake(x, y);
[CATransaction commit];

您还可以使用方便函数

[CATransaction setDisableActions:YES]

我也是。

注意: 请务必阅读 Yogev Shelly 的评论,以了解任何可能发生的陷阱。

正如其他人所建议的,您可以使用 CATransaction
由于 CALayer 的默认隐式动画持续时间为0.25秒,因此出现了问题。

因此,在我看来,比 setDisableActions更简单的替代方法是使用值为 0.0setAnimationDuration

[CATransaction begin];
[CATransaction setAnimationDuration:0.0];
layer.position = CGPointMake(x, y);
[CATransaction commit];

迅捷3扩展:

extension CALayer {
class func performWithoutAnimation(_ actionsWithoutAnimation: () -> Void){
CATransaction.begin()
CATransaction.setValue(true, forKey: kCATransactionDisableActions)
actionsWithoutAnimation()
CATransaction.commit()
}
}

用法:

CALayer.performWithoutAnimation(){
someLayer.position = newPosition
}

结合以前的答案在这里为迅捷4,以清楚地使动画持续时间明确..。

extension CALayer
{
class func perform(withDuration duration: Double, actions: () -> Void) {
CATransaction.begin()
CATransaction.setAnimationDuration(duration)
actions()
CATransaction.commit()
}
}

用法..。

CALayer.perform(withDuration: 0.0) {
aLayer.frame = aFrame
}