如何立即移动CALayer(无需动画)

83

我正在尝试在iOS应用程序中拖动CALayer

一旦我更改了其位置属性,它会尝试动画到新位置并在整个区域闪烁:

 layer.position = CGPointMake(x, y)

我该如何立即移动CALayers?我似乎无法理解核心动画API。


关于这个非常古老的QA,今天的关键问题是:https://dev59.com/gXE95IYBdhLWcg3wlu-z#56980329 - Fattie
5个回答

174
您需要将您的调用包装在以下内容中:

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

1
就是这样。我甚至没有想到CATransaction。非常感谢! - Mel
5
没错,六年半过去了,仍然有帮助。:D - Fogmeister
1
iOS7支持新的速记方式:[UIView performWithoutAnimation:<#^(void)actionsWithoutAnimation#>]; - k06a
2
七年七个月零十七天后:仍然有用。谢谢! - kanobius
1
�年�,点�� - 0xNSHuman
显示剩余3条评论

38

Swift 3扩展:

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

使用方法:

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

1
在块中添加@noescape属性是有用的,可以允许(并明确)在块中不需要使用self - Andrew

24

你还可以使用方便的函数

[CATransaction setDisableActions:YES] 

同样也要。

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


5
重要提示,这会影响所有的CALayer,因此您需要在完成后重新启用动画,例如使用命令[CATransaction setDisableActions:YES]。 - Yogev Shelly
该死,我应该早点说。很好的挽救。该命令禁用动画直到它设置为NO或者核心图形动画引擎完成一个运行周期。不确定那是否是正确的词:/但感谢你为大家澄清这一点。 - Yogurt

15

正如其他人建议的那样,您可以使用CATransaction
问题出现在CALayer默认的隐式动画持续时间为0.25秒。

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

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

易于记忆,当您重新阅读代码时易于理解,且更容易输入。谢谢! - Mr. T

5

以下是 Swift 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
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接