3

のカスタム拡張機能を使用して、スクロール可能なグラフとして描画してCALayerCGContextAddCurveToPointます[ MyCustomCALayer drawInContext]

私は実際にグラフの全長を描画しているわけではなく、UIPanGestureRecognizer新しい水平オフセットを反映するように更新するたびにレイヤーの内容を再描画しています。このようにして、グラフの可視部分のみを描画し、レイヤーの境界は画面のサイズまでしか拡張しません。

[ MyCustomCALayer setNeedsDisplay ]グラフ データが変更されたとき、またはパン オフセットが変更されたとき[ MyCustomCALayer drawInContext]に呼び出され、呼び出されます。

ただし、パン中にレイヤーを再描画するたびに、この奇妙なゴーストが発生します。少し調べてみると、レイヤーのコンテンツを再描画することによって呼び出される暗黙のアニメーションである可能性がありますが、決定的な答えは見つかりません。

静止時のグラフは次のようになります。 安静時に

そして、これはゴーストの再描画を伴うパンニング中です。 パン中

確かに、グラフ全体を描画し、レイヤーのプロパティをパンに調整すると、ゴーストpositionは発生しませんが、メモリに大きな長いビットマップがあるのは悪いことのようです.

誰もこの種のゴーストを見たことがありますか? それが(私が疑うように)暗黙のアニメーションである場合、どうすればそのアニメーションを無効にできますか?

4

2 に答える 2

8

おそらく暗黙のアニメーションになります。再描画 (コンテンツの変更) は、Core Animation の他のすべてと同様にアニメーション化されます。

これを防ぐにはいくつかの方法があります。描画を行うために CALayer をサブクラス化する場合は、-[CALayer actionForKey:] をオーバーライドして、コンテンツの変更に対して nil を返すのが最善の方法です。

- (id<CAAction>)actionForKey:(NSString *)key 
{
    if ([key isEqualToString: @"contents"]) 
    {
        return nil;
    }

    return [super actionForKey: key];
}
于 2012-05-23T22:17:51.687 に答える
2

暗黙のアニメーションを無効にする別の手法は次のとおりです。

    [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];

暗黙のアニメーションを無効にしてもうまくいかない場合は、スクロールビューを使用して、そのスクロールビューのコンテンツである大きなビューにすべてを描画することを検討できます。

編集:

その方法では、CATransactionブロック内で変更を行う必要があることを忘れました

于 2012-05-24T00:27:42.843 に答える