web-dev-qa-db-ja.com

CALayerを瞬時にどのように移動しますか(アニメーションなし)

IOSアプリでCALayerをドラッグしようとしています。

その位置プロパティを変更するとすぐに、新しい位置にアニメーション化しようとし、その場所全体でちらつきます。

 layer.position = CGPointMake(x, y)

CALayersを即座に移動するにはどうすればよいですか?コアアニメーションAPIを理解できていないようです。

74
Mel

呼び出しを次のようにラップします。

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

Swift 3 Extension:

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

使用法 :

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

便利な機能も使えます

[CATransaction setDisableActions:YES] 

同様に。

注:発生する可能性のある問題を理解するには、Yogev Shellyのコメントを必ずお読みください。

20
Biclops

他の人が示唆しているように、CATransactionを使用できます。
この問題は、CALayerのデフォルトの暗黙的なアニメーション期間が0.25秒であるために発生します。

したがって、setDisableActionsに代わる(私の意見では)より簡単な方法は、setAnimationDuration0.0の値で使用することです。

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

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
        }
2
Giles