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

Mel*_*Mel 74 cocoa-touch core-animation objective-c calayer ios

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

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

 layer.position = CGPointMake(x, y)
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*ieb 161

您想在以下内容中打包您的电话:

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

  • 是的,6年半以后.仍然有帮助.:d (4认同)
  • 7年零7个月,17天后:仍然有帮助.谢谢! (2认同)

Cry*_*ppo 27

Swift 3扩展:

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

用法:

CALayer.performWithoutAnimation(){
    someLayer.position = newPosition
}
Run Code Online (Sandbox Code Playgroud)


Bic*_*ops 20

您还可以使用便利功能

[CATransaction setDisableActions:YES] 
Run Code Online (Sandbox Code Playgroud)

同样.

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

  • 重要的是,这会影响所有CALayer,因此您希望在完成后重新启用操作,即[CATransaction setDisableActions:YES] (5认同)

So *_* It 14

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

因此,更容易(在我看来)替代方法setDisableActions是使用setAnimationDuration值为0.0.

[CATransaction begin];
[CATransaction setAnimationDuration:0.0];
layer.position = CGPointMake(x, y);
[CATransaction commit];
Run Code Online (Sandbox Code Playgroud)


Gil*_*les 5

结合之前针对 Swift 4 的答案,可以清楚地使动画持续时间明确......

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

用法...

CALayer.perform(withDuration: 0.0) {
            aLayer.frame = aFrame
        }
Run Code Online (Sandbox Code Playgroud)