Wie kann ich erkennen, Wann ein UIWebView ist fertig Rendern (nicht laden)?
Weiß ich wenn es fertig geladen... (webViewDidFinishLoad), aber ich will
[webView.layer renderInContext:UIGraphicsGetCurrentContext()];
erstellen ein Bild aus der UIWebView. Gelegentlich erhalte ich das Bild vor der webView finishing rendering. Ich kann verwenden performSelector zu verzögern, die bekommen von dem Bild, aber die Höhe der Wartezeit ist willkürlich und spröde.
- Ich habe genau dasselbe Problem. Ich mache renderInContext auf webViewDidFinishLoading und macht es den bisherigen Stand der web-Ansicht auf den Kontext. Das seltsame ist, dass das erste mal, dass ich das laden von Inhalten in der web-Ansicht, der screenshot ist richtig dargestellt. Es ist nur, nachdem die ersten Inhalte laden, es beginnt, zeigen die oben beschriebenen Verhalten
- Ich glaube nicht, dass es ein guter Weg, dies zu tun. Ich habe versucht, Injektion einige javascript über stringByEvaluatingJavaScriptFromstring zu nennen, zurück zu meinem Obj-C-code, aber es war nicht zuverlässiger als eine willkürliche Verzögerung. 🙁
- Ich schliesse mich. Ich mache eine verzögerte performSelector als tillerstarr beschreibt, in der die Frage, das ist eine Verschwendung von Zeit und liefert inkonsistente Ergebnisse. Ich bin zufällig zum ausführen von jQuery in meine UIWebView, und es hat eine "bereit" - Ereignis, das ausgelöst wird, und ist zuverlässiger sein soll, dass ein regulärer Javascript-onLoad. Ich denke, in der Theorie, man hätte die "bereit" - Ereignis auslösen irgendeiner Art von link activity, die würde Feuer webView:shouldStartLoadWithRequest:navigationType. Denkst du, dass das einen Versuch Wert?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies kann abhängig von der Art der Grafik-Kontext müssen Sie die Ansicht wiedergegeben, aber Sie können rufen Sie
denen offenbar tricks, die UIWebView zu denken, dass es gedruckt wird. Dies kann helfen, wenn Ihr Ziel ist das erfassen der kompletten Seite. Wir hatten das problem vor kurzem, in dem, selbst wenn die Seite vollständig geladen wurde, ruft plain old -drawRect: nicht das ganze Rendern der Seite, wenn einige war es offscreen.
Ich hatte ein ähnliches problem in einer Anwendung, wo ich die volle Kontrolle über die Inhalte. Das wird nicht funktionieren, laden Sie beliebige Seiten aus dem web, aber es kann funktionieren, wenn Sie wissen, Ihre high-level-DOM-Struktur vor, und es ändert sich nicht viel.
Was für mich gearbeitet war der folgende.
Hatte ich rekursiv die ersten
UIWebView
's Untersicht TypUIWebOverflowScrollView
mit einem Rahmen von(0, 0, 1024, 768)
. Wenn ich nicht finden konnte ein, das war ein Sicheres Zeichen dafür, dass der Inhalt noch nicht gerendert wurde noch.Gefunden zu haben, ich check diese Ansicht ist
layer.sublayers.count
. Wenn das Rendern abgeschlossen ist, würde ich am Ende immer mit einem oder drei Unterebenen. Wenn das rendering noch nicht fertig, aber der content-Ansicht hatte immer bei den meisten eine sublayer.Nun, das ist speziell für meinen DOM-Struktur—aber es kann möglich sein, dass Sie machen einen ähnlichen "test", wenn Sie vergleichen sublayer Baum vor und nach dem Rendern. Für mich gilt die Faustregel war "die erste rekursiv gefunden Untersicht Typ
UIWebOverflowScrollView
mindestens drei Unterebenen", für Sie wird es wahrscheinlich anders sein.Jedenfalls sehr darauf achten, wenn Sie entscheiden, um diesen Ansatz verwenden, auch wenn Sie nicht abgelehnt bekommen für die Suche in
UIWebView
's view-und layer-Hierarchie, diese Art von Verhalten ist unzuverlässig, und sehr wahrscheinlich ist zu ändern in zukünftigen Versionen von iOS. Es kann sehr gut sein, unterscheidet sich zwischen iOS 5 und iOS 6 als gut.Schließlich, code-snippets für MonoTouch, die einfach sein sollte, um übersetzen zu Ziel C:
Was ist mit dem Fenster.onload-oder jQuerys $(document).ready-Ereignis zum auslösen der shouldStartLoad Rückruf?
Etwas wie:
und in Ihrem UIWebViewDelegate etwas wie:
Mit dieser Methode können Sie vorwärts jedes mögliche Ereignis aus dem JS-code, um Ihre obj-c-code.
Hoffe, das hilft. Der Beispielcode geschrieben ist, in den browser, und daher nicht getestet! 😉
Wenn Sie Zugriff auf die HTML-Datei und können es Bearbeiten - fügen Sie einfach einige spezielle variable, die sagen, der code, der das rendering fertig ist.
Dann verwenden Sie die Methode
stringByEvaluatingJavaScriptFromString
zu wissen, sollten Sie beginnen, einige Aktionen oder nicht.Das Beispiel unten ist ziemlich schmutzig, aber hoffe, es wird helfen, und geben Ihnen die Idee:
while
Schleife. Auch, es beantwortet nicht die Frage: die übertragung erfolgt asynchron, da iOS 6, und so gibt es keine bestimmte Art und Weise zu wissen, Wann es getan von JavaScript.Sowas funktionieren könnte.
webView.loading
zurückYES
imwebViewDidFinishLoad:
?