drawRect:
「ロード」された場合に a を描画するメソッドをカスタマイズしていますNSImage
( a から取得しているため、ロードには数秒の時間がかかりますWebView
)。まだ読み込まれていません。
- (void)drawRect:(NSRect)dirtyRect
{
NSImage *imageToDraw = [self cachedImage];
if (imageToDraw != nil) {
[imageToDraw drawInRect:dirtyRect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0 respectFlipped:YES hints:nil];
} else {
//I need help here
[self setNeedsDisplay:YES];
}
}
私の質問は、後者を行う方法です。[self cachedImage]
画像が利用できない場合は戻りますnil
が、次の数秒以内にいつでも利用できるようになる可能性があり、その時点でカスタムビューが既に画面に表示されているため、描画したいと思います。
私の最初の本能は[self setNeedsDisplay:YES];
、画像が利用できない場合に呼び出しを試みることでした.CocoaにdrawRect
次回(画像が描画されるまで何度も何度も)呼び出すように指示することを期待していましたが、うまくいきません.
ここからどこへ行くことができるかについての指針はありますか?
編集:
WebView
loadRequest が完全に処理されたときに起動するデリゲート メソッドについてはよく知っています。ただし、アプリケーションの残りの部分の構造上、これらを使用することは非常に困難ですが、現在の回答を踏まえて、何とか使用してみようと思います。(また、私の drawRect: メソッドは比較的軽量で、上記のコード以外には何もないことに注意してください。)
私は現在、同じ WebView にそれぞれの画像を生成するように要求するカスタム データを含む約 10 以上のカスタム ビューを持っています。同時に、NSCache からイメージを取得し (各カスタム ビューに対応する識別子を使用)、イメージが存在しないか更新する必要がある場合は作成し、まだ利用できない場合は nil を返します。- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
したがって、または別のメソッドから [view setNeedsDisplay:YES] を呼び出すほど簡単ではありません。