1. ホーム
  2. iphone

[解決済み] CALayer setNeedsDisplayInRect:] の暗黙のアニメーションを無効にする。

2022-05-16 09:15:42

質問

レイヤーの -drawInContext: メソッドに、複雑な描画コードが含まれています。私は、私が行う必要がある描画の量を最小限にしようとしているので、私は変更された部分のみを更新するために -setNeedsDisplayInRect: を使用しています。これは見事に動作しています。しかし、グラフィックシステムが私のレイヤーを更新するとき、クロスフェードを使って古い画像から新しい画像に移行しています。瞬時に切り替わるようにしてほしいです。

CATransaction を使用してアクションをオフにし、期間をゼロに設定しようとしましたが、どちらもうまくいきません。以下は私が使用しているコードです。

[CATransaction begin];
[CATransaction setDisableActions: YES];
[self setNeedsDisplayInRect: rect];
[CATransaction commit];

代わりに使うべきCATransactionの別のメソッドはありますか(kCATransactionDisableActionsで-setValue:forKey:も試しましたが、同じ結果でした)。

どのように解決するのですか?

レイヤーのアクション辞書で [NSNull null] をアニメーションとして返すように設定します。 例えば、私は

NSDictionary *newActions = @{
    @"onOrderIn": [NSNull null],
    @"onOrderOut": [NSNull null],
    @"sublayers": [NSNull null],
    @"contents": [NSNull null],
    @"bounds": [NSNull null]
};

layer.actions = newActions;

レイヤーのサイズや内容の変更だけでなく、レイヤー内のサブレイヤーの挿入や変更時にフェードイン/アウトのアニメーションを無効にするためです。 私は contents キーは、更新された描画でのクロスフェードを防止するために探しているものだと思います。


Swiftバージョンです。

let newActions = [
        "onOrderIn": NSNull(),
        "onOrderOut": NSNull(),
        "sublayers": NSNull(),
        "contents": NSNull(),
        "bounds": NSNull(),
    ]