1

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次回(画像が描画されるまで何度も何度も)呼び出すように指示することを期待していましたが、うまくいきません.

ここからどこへ行くことができるかについての指針はありますか?


編集:

WebViewloadRequest が完全に処理されたときに起動するデリゲート メソッドについてはよく知っています。ただし、アプリケーションの残りの部分の構造上、これらを使用することは非常に困難ですが、現在の回答を踏まえて、何とか使用してみようと思います。(また、私の drawRect: メソッドは比較的軽量で、上記のコード以外には何もないことに注意してください。)

私は現在、同じ WebView にそれぞれの画像を生成するように要求するカスタム データを含む約 10 以上のカスタム ビューを持っています。同時に、NSCache からイメージを取得し (各カスタム ビューに対応する識別子を使用)、イメージが存在しないか更新する必要がある場合は作成し、まだ利用できない場合は nil を返します。- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frameしたがって、または別のメソッドから [view setNeedsDisplay:YES] を呼び出すほど簡単ではありません。

4

3 に答える 3

4

私の最初の本能は、[self setNeedsDisplay:YES]; を呼び出してみることでした。画像が利用できなかった場合、Cocoa に次回 drawRect を再度呼び出すように指示することを期待して (画像が描画されるまで何度も何度も)

これは、機能したとしても、信じられないほど非効率的です。

次の数秒以内にいつでも利用可能になる可能性があり、その時点で描画したい

ですから、そのときは、 に電話して[view setNeedsDisplay:YES]ください。

イメージがいつ利用可能になるかを直接判断する手段がない場合は、ポーリングする必要があります。NSTimer妥当な間隔で繰り返しを設定します。たとえば、0.25 秒程度です。(これもかなり非効率的ですが、少なくとも 1 秒間に 60 回以上ではなく 4 回しか実行されていません。これは、使用する CPU とバッテリーの電力量と、時間間の遅延の長さという 2 つの要因の間のトレードオフです。画像が利用可能になり、それを表示する時間.)

私の drawRect: メソッドは比較的軽量で、上記のコード以外には何もありません。

で何もしなくても-drawRect:、Cocoa は依然として舞台裏で多くの作業を行う必要があります。ダーティ rect の管理、ウィンドウのバッキング ストアの適切な領域のクリア、画面へのフラッシュなどです。それは無料です。

于 2012-05-12T22:59:11.630 に答える
1

通常、何かのダウンロードが完了すると、何らかのデリゲート メソッドが呼び出されます。そのメソッドを実装して、そこで呼び出す必要setNeedsDisplay:YESがあります。

于 2012-05-12T22:55:29.543 に答える
0

Webkit のドキュメント:

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DisplayWebContent/Tasks/ResourceLoading.html#//apple_ref/doc/uid/20002028-CJBEHAAG

Webview デリゲートに次のメソッドを実装する必要があります。

 - webView:resource:didFinishLoadingFromDataSource: 

そこにあなたが呼び出すことができます[view setNeedsDisplay:Yes]

于 2012-05-12T23:09:10.093 に答える