CALayerの暗黙的なアニメーションを無効にする方法は?

animation calayer ios
CALayerの暗黙的なアニメーションを無効にする方法は?

それは私を狂わせる! 描画アプリケーションに取り組んでいます。 シートと呼ばれる「UIView」で作業しているとしましょう。

このビューにいくつかのサブレイヤー( [sheet.layer addSublayer:…​])を追加してから、それらに描画したいと思います。 そのために、「CGImageRef」を作成し、それをレイヤーの「contents」に入れています。 しかし、それはアニメーションであり、私はそれを望んでいません。

私はすべてを試しました:

  • removeAnimationForKey:

  • 「removeAllAnimations」

  • アクション辞書を設定する

  • アクションレイヤー「デリゲート」を使用する

  • [CATransaction setDisableAnimations:YES]

それは正しいようです。 このレイヤーがまだアニメーション化されている理由がわかりません; _; +何か間違ったことをしていますか? 秘密の方法はありますか?

  36  13


ベストアンサー

CATransactionでコードをラップして、アニメーションを明示的に無効にする必要があります

[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue
                 forKey:kCATransactionDisableActions];
layer.content = someImageRef;
[CATransaction commit];

37


迅速

CATransaction.begin()
CATransaction.setDisableActions(true)

// change layer properties that you don't want to animate

CATransaction.commit()

25


Mac OS X 10.6およびiOS 3の時点で、 CATransaction`にはキー kCATransactionDisableActions`の値を設定する `setDisableActions`メソッドもあります。

[CATransaction begin];
[CATransaction setDisableActions:YES];

layer.content = someImageRef;

[CATransaction commit];

Swiftでは、この拡張メソッドを使用したいです:

extension CATransaction {
    class func withDisabledActions(_ body: () throws -> T) rethrows -> T {
        CATransaction.begin()
        CATransaction.setDisableActions(true)
        defer {
            CATransaction.commit()
        }
        return try body()
    }
}

あなたはそれからこのようにそれを使うことができます:

CATransaction.withDisabledActions {
    // your stuff here
}

15


別の方法:

  1. sheet.layerのデフォルトのアニメーションを無効にする必要があります。
    サブレイヤーを追加するときに暗黙的に呼び出されます。

  2. 各サブレイヤーのコンテンツアニメーションも必要です。 もちろん、できます
    sublayer.contentを設定するたびに、CATransactionの「kCATransactionDisableActions」を使用します。 ただし、サブレイヤーを作成するときに、このアニメーションを一度無効にすることができます。

” ” ‘

これがコードです:

// disable animation of container
sheet.layer.actions = [NSDictionary dictionaryWithObject:[NSNull null]
                                                  forKey:@"sublayers"];

// disable animation of each sublayer
sublayer.layer.actions = [NSDictionary dictionaryWithObject:[NSNull null]
                                                     forKey:@"content"];

// maybe, you'll also have to disable "onOrderIn"-action of each sublayer.

11


再利用可能なグローバルコード:

/**
 * Disable Implicit animation
 * EXAMPLE: disableAnim{view.layer?.position = 20}//Default animation is now disabled
 */
func disableAnim(_ closure:()->Void){
    CATransaction.begin()
    CATransaction.setDisableActions(true)
    closure()
    CATransaction.commit()
}

このコードをコードの任意の場所に追加します(グローバルスコープ)

1


*スイフト2 *

次のようにして、すべてのアニメーションを無効にすることができました。ここで、「myView」は作業中のビューです。

myView.layer.sublayers?.forEach { $0.removeAllAnimations() }

補足として、すべてのレイヤーを削除します。

myView.layer.sublayers?.forEach { $0.removeFromSuperlayer() }

0


*前*でビューにレイヤーを追加します `[self.layer addSublayer:yourCALayer]`また、既に追加した後、アニメーションキーを上書きすることにより、CALayerの特定のアニメーションプロパティを無効にすることができます。 NULLに設定したキーは、プロパティにちなんで名前が付けられます。ここでは、 `layer.position = CGPoint(x、y);`のように表示されます

yourCALayer.actions = [NSDictionary dictionaryWithObject:[NSNull null] forKey:@"position"];

actions`プロパティは nil`の保存を許可しないNSDictionaryであるため、 (id)kCFNull`と同じである [NSNull null] `でNULLオブジェクトに明示的に設定します。ビューレイヤーのすべてのサブレイヤーを繰り返し処理することで、すべてのサブレイヤーを…​

for (CALayer *iterationLayer in self.layer.sublayers ) {
    iterationLayer.actions = [NSDictionary dictionaryWithObject:[NSNull null] forKey:@"position"];
    //or for multiple keys at once
    NSNull *nop = [NSNull null];
    iterationLayer.actions = [NSDictionary dictionaryWithObjects:@[nop,nop] forKeys:@[@"position",@"contents"]];
}

0


これは古い質問ですが、問題は残っています。 CALayerが強制するアニメーションが不要な場合があります。 これらのアクションをオフにしたかっただけなので、トランザクションベースのアプローチには満足していませんでした。 善のために。 CALayerをサブクラス化して、アクションを許可するかグローバルに無効にするかを選択できるようにするSwift 4ソリューションを次に示します。 同じ内容でCAShapeLayer、CATextLayerサブクラスを作成することもできます。

public class ActionCALayer: CALayer {
    public var allowActions: Bool = false

    override public func action(forKey event: String) -> CAAction? {
        return allowActions ? super.action(forKey: event) : nil
    }
}

0


  • Swift 4拡張機能:*

extension CATransaction {

    static func disableAnimations(_ completion: () -> Void) {
        CATransaction.begin()
        CATransaction.setDisableActions(true)
        completion()
        CATransaction.commit()
    }

}

使用法 :

    CATransaction.disableAnimations {
        // things you don't want to animate
    }

0


タイトルとURLをコピーしました