81

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

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

 layer.position = CGPointMake(x, y)

我怎样才能CALayers立即移动?我似乎无法理解 Core Animation API。

4

5 回答 5

173

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

[CATransaction begin]; 
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
layer.position = CGPointMake(x, y);
[CATransaction commit];
于 2008-10-22T17:22:12.883 回答
36

Swift 3 扩展:

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

用法 :

CALayer.performWithoutAnimation(){
    someLayer.position = newPosition
}
于 2015-11-27T16:59:47.583 回答
23

您还可以使用便利功能

[CATransaction setDisableActions:YES] 

也是。

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

于 2011-09-13T23:20:26.660 回答
15

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

因此,一个更简单(在我看来)的替代方法setDisableActionssetAnimationDuration使用0.0.

[CATransaction begin];
[CATransaction setAnimationDuration:0.0];
layer.position = CGPointMake(x, y);
[CATransaction commit];
于 2013-05-05T04:04:42.863 回答
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
        }
于 2018-11-22T11:34:47.697 回答