IOSアプリでCALayer
をドラッグしようとしています。
その位置プロパティを変更するとすぐに、新しい位置にアニメーション化しようとし、その場所全体でちらつきます。
layer.position = CGPointMake(x, y)
CALayers
を即座に移動するにはどうすればよいですか?コアアニメーションAPIを理解できていないようです。
呼び出しを次のようにラップします。
[CATransaction begin];
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
layer.position = CGPointMake(x, y);
[CATransaction commit];
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
}
便利な機能も使えます
[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
}