3

Webソケットを介してデータが継続的に提供される小さなMacアプリケーションを構築しています。各データセグメントを処理した後、データはに表示されますWebView。新しいデータがデータを置き換えることはありません。代わりに、 DOM操作を使用WebViewして新しいデータが常にコンテンツに追加されます。以下のコードサンプルは、私が何をしているのかを示しているはずです。WebView

DOMDocument *doc = self.webview.mainFrame.DOMDocument;
DOMHTMLElement *container = (DOMHTMLElement *)[doc createElement:@"div"];
NSString *html = [NSString stringWithFormat:@"... omitted for the sake of brevity ... "];
[container setInnerHTML:html];
[doc.body appendChild:container];

レンダリングはWebView明らかに非同期で行われます。DOM操作が終了し、コンテンツが描画されたことを確認する方法はありますか?[webview scrollToEndOfDocument:self]自動スクロールを実装するようなものを使用したいと思います。DOMイベントは、DOMが変更されたとき、ただしこれらの変更がレンダリングされる前にトリガーされたように見えるため、リッスンは役に立ちませんでした。私が今まで使っているコードは次のようなものです

[self.webview.mainFrame.DOMDocument addEventListener:@"DOMSubtreeModified" listener:self useCapture:NO];

と組み合わせて

- (void)handleEvent:(DOMEvent *)event
{
    [self.webview scrollToEndOfDocument:self];
}

このコードの問題は、スクロールが早すぎることです。私は基本的に常に1データセグメント遅れています。コンテンツが描画されたときにトリガーされる任意の種類のコールバック/通知に登録できますか?

4

1 に答える 1

0

タイマーの使用

を使用して自動スクロールを実装できますNSTimer。このソリューションが負担する課題は、タイマーを無効にして手動スクロールを許可するタイミングを把握することです。後者はできませんでした。とにかく、タイマーを使用して自動スクロールを有効にするコードは次のとおりです。

self.WebViewAutoScrollTimer = 
  [NSTimer scheduledTimerWithTimeInterval:1.0/30.0 
                                   target:self
                                 selector:@selector(scrollWebView:)
                                 userInfo:nil
                                  repeats:YES];

scrollWebView:scrollToEndOfDocument:単純にWeb ビューで呼び出すメソッドです。

通知の使用

NSViewFrameDidChangeNotificationWeb ビューによって出力されるリストでは、フレーム サイズが変更された場合にのみスクロールできます。これらの変更は、新しいコンテンツが追加されたときに発生しますが、ウィンドウのサイズ変更など、カプセル化ビューのサイズが変更されたときにも発生します。私の実装では、これら 2 つのシナリオが区別されません。

NSClipView *contentView = self.webView.enclosingScrollView.contentView;
[contentView setPostsFrameChangedNotifications:YES];
[[NSNotificationCenter defaultCenter] addObserverForName:NSViewFrameDidChangeNotification
                                                  object:contentView
                                                   queue:nil
                                              usingBlock:^(NSNotification *notification) {
                                                  [self.webView scrollToEndOfDocument:self];
                                              }];

注: Web ビューのスクロール ビューのコンテンツ ビューに、フレーム サイズが変更されたときに通知を送信するNSViewように指示することが重要です。これは、上記の例の最初の 2 行のコードを使用して実現されます。

于 2013-01-03T15:48:57.607 に答える