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

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

 layer.position = CGPointMake(x, y)

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

有帮助吗?

解决方案

您想在以下内容中打包:

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

其他提示

Swift 3扩展:

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

用法:

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

您也可以使用便利功能

[CATransaction setDisableActions:YES] 

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

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

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

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

将以前的答案与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
        }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top