2013-06-23 11 views
5

Gibt es Techniken, um ein UIWebView neu zu zeichnen? Ich habe setNeedsDisplay und setNeedsLayout auf dem UIWebView und seinem UIScrollView versucht, aber keiner hat gearbeitet.Force UIWebView um neu zu zeichnen?

+0

kann neu laden die Arbeit tun? – Raptor

+0

@ShivanRaptor Es kann, aber es würde erfordern die gesamte Seite neu zu laden, die * so * sehr lange im Vergleich zu einfachen Neuzeichnen/Relayouting, was bereits da ist. Ich habe die Lösung gefunden. – mattsven

+0

Was ist mit dem 'Javascript' im HTML-Inhalt? oder das 'meta'-Tag im' HTML'-Header? – holex

Antwort

9

Wörtlich die Antwort direkt nach der Frage gefunden. Der Schlüssel war, den Unteransichten von UIWebView 's scrollView zu zeigen, um sich neu zu zeichnen - besonders die UIWebBrowserView.

- (void) forceRedrawInWebView:(UIWebView*)webView { 
    NSArray *views = webView.scrollView.subviews; 

    for(int i = 0; i<views.count; i++){ 
     UIView *view = views[i]; 

     //if([NSStringFromClass([view class]) isEqualToString:@"UIWebBrowserView"]){ 
      [view setNeedsDisplayInRect:webView.bounds]; // Webkit Repaint, usually fast 
      [view setNeedsLayout]; // Webkit Relayout (slower than repaint) 

      // Causes redraw & relayout of *entire* UIWebView, onscreen and off, usually intensive 
      [view setNeedsDisplay]; 
      [view setNeedsLayout]; 
      // break; // glass in case of if statement (thanks Jake) 
     //} 
    } 
} 

Ich habe das kommentiert, wenn Aussage, sicher zu sein und vermeidet die Abhängigkeit von UIWebBrowserView ‚s Klassennamen nicht ändern. Ohne es trifft es alle UIViews, die sich in der Scrollview befinden, was zu diesem Zeitpunkt kein wirkliches Problem ist (kein signifikanter Overhead), sondern könnte sich immer ändern.

EDIT:

In einigen Fällen kann das folgende JavaScript-Schnipsel die gleiche/ähnliche Sache erreichen:

window.scrollBy(1, 1); window.scrollBy(-1, -1); 

Man könnte meinen, UIScrollView ‚s contentOffset dies auch tun würde, aber das ist nicht immer der Fall in meiner Erfahrung - aus irgendeinem Grund ist window.scrollTo in dieser Hinsicht speziell.

Gist: https://gist.github.com/matt-curtis/5843862

+0

Hallo, Ihre Antwort hat mir geholfen. Beachten Sie jedoch, dass die for-Schleife die Art und Weise, wie Sie die if-Anweisung auskommentiert haben, nur die erste Ansicht im Array aktualisiert, da die break-Anweisung immer noch nicht auskommentiert ist. Ich denke, es funktioniert immer noch, weil die Webbrowser-Ansicht normalerweise die erste Ansicht ist, aber vielleicht möchten Sie Ihre Lösung etwas bearbeiten, da die for-Schleife in diesem Fall nichts tut =) –

+1

@jake_hetfield Danke - das habe ich verpasst! Ich fügte hinzu, dass ich die Klassen nicht als Nachtrag in Skalierbarkeit/Effizienz geprüft habe und dass ich die "Pause" vergessen habe. 'Preciate es! Freut mich, dass die Antwort Ihnen geholfen hat - hat mir auch geholfen, als ich mit diesem Problem kämpfte :) Erinnert mich auch daran, etwas anderes einzubringen, an das ich mich zu diesem Thema erinnert habe. – mattsven

+1

Das rettet mein Leben: self.wkWebView.evaluateJavaScript ("window.scrollBy (1, 1); window.scrollBy (-1, -1);", completionHandler: nil) –

0

Das ist mein Leben retten:

self.wkWebView.evaluateJavaScript("window.scrollBy(1, 1);window.scrollBy(-1, -1);", completionHandler: nil) 

diese Zeile auf webview hinzufügen tat Last Delegat Ereignis oder wkwebview Navigation Finish

MAN

Dank hat !!!!

Verwandte Themen