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

时间:2008-10-22 15:40:41

标签: ios objective-c cocoa-touch core-animation calayer

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

一旦我更改了它的位置属性,它就会尝试动画到新位置并在整个地方闪烁:

 layer.position = CGPointMake(x, y)

如何立即移动CALayers?我似乎无法理解Core Animation API。

5 个答案:

答案 0 :(得分:152)

您想在以下内容中打包:

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

答案 1 :(得分:23)

Swift 3扩展:

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

用法:

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

答案 2 :(得分:18)

您也可以使用便利功能

[CATransaction setDisableActions:YES] 

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

答案 3 :(得分:14)

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

因此,setDisableActions更容易(我认为)的替代方法是使用值setAnimationDuration的{​​{1}}。

0.0

答案 4 :(得分:2)

结合此处先前针对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
        }