display
CALayerがどのように表示され、どのようにdrawInContext
関連しているかがよくわかりませんdrawRect
。
[self.view setNeedsDisplay]
1秒ごとに設定するNSTimerがある場合、。drawRect
内のNSLogステートメントで示されているように、1秒ごとに呼び出されdrawRect
ます。
しかし、CALayerをサブクラス化し、それをビューに使用する場合、display
メソッドを空にすると、nowdrawRect
は呼び出されません。 更新:ただしdisplay
、NSLogステートメントで示されているように、1秒ごとに呼び出されます。
その空のメソッドを削除して空のdisplay
メソッドを追加するとdrawInContext
、再びdrawRect
呼び出されることはありません。 更新:ただしdrawInContext
、NSLogステートメントで示されているように、1秒ごとに呼び出されます。
正確には何が起こっているのですか?選択的に呼び出すことができ、何とかしてdisplay
選択的に呼び出すことができるようです(どのように?)が、ここでの実際の状況は何ですか?drawInContext
drawInContext
drawRect
更新:答えにはもっと手がかりがあります:
CoolLayer.m
コードを次のように変更しました。
-(void) display {
NSLog(@"In CoolLayer's display method");
[super display];
}
-(void) drawInContext:(CGContextRef)ctx {
NSLog(@"In CoolLayer's drawInContext method");
[super drawInContext:ctx];
}
たとえば、ビューの場所(100,100)に月(Core Graphicsによって描画された円として)があり、それを場所(200,200)に変更した場合、当然、と呼びます[self.view setNeedsDisplay]
。これで、CALayerはdrawRect
月がどのように表示されるかを指示するので、新しいビュー画像のキャッシュはまったくありません。
それでも、エントリポイントはCALayerdisplay
であり、次にCALayerdrawInContext
です。ブレークポイントをに設定するdrawRect
と、コールスタックは次のように表示されます。
したがって、CoolLayerdisplay
が最初に入力され、次にCALayer、display
次にCoolLayer、次にCALayerに移動することがわかります。この状況では、新しいイメージ用のそのようなキャッシュは存在しません。drawInContext
drawInContext
そして最後に、CALayerdrawInContext
はデリゲートを呼び出しますdrawLayer:InContext
。デリゲートはビュー(FooViewまたはUIView)...でありdrawLayer:InContext
、UIViewのデフォルトの実装です(オーバーライドしなかったため)。最後にそれをdrawLayer:InContext
呼び出しますdrawRect
。
だから私は2つのポイントを推測しています:画像のキャッシュがないのになぜそれがCALayerに入るのですか?このメカニズムにより、画像はコンテキストで描画され、最終的にに戻りdisplay
、このコンテキストからCGImageが作成され、キャッシュされた新しい画像として設定されます。これは、CALayerが画像をキャッシュする方法です。
もう1つよくわからないのは、[self.view setNeedsDisplay]
常に呼び出されるようにトリガーdrawRect
する場合、CALayerにキャッシュされた画像をいつ使用できるかということです。それは...MacOS Xで、別のウィンドウがウィンドウを覆い、上部のウィンドウが移動したときです。これで、すべてを再描画するために呼び出す必要はありませんがdrawRect
、CALayerでキャッシュされた画像を使用できます。または、iOSでは、アプリを停止し、何か他のことをしてアプリに戻ると、を呼び出す代わりに、キャッシュされた画像を使用できますdrawRect
。しかし、これら2つのタイプの「ダーティ」をどのように区別するのでしょうか。1つは「不明なダーティ」です。これは、ロジックの指示に従って月を再描画する必要があることdrawRect
です(座標にも乱数を使用できます)。他のタイプの汚れは、それが覆われているか、消えるようにされており、今度は再表示する必要があることです。