Erstellen Sie ein UIImage, indem Sie UIWebView auf einem Hintergrund-Thread - iPhone wiedergeben

9

Kennt jemand einen Weg oder hat er eine kreative Idee, wie man ein UI-Bild erhält, das von einem UIWebView gerendert wird? Der Haken ist, dass muss auf einem Hintergrundthread sein.

Ich werde es ausarbeiten: Ich versuche, das Bild aus mehreren UIWebViews jede Sekunde + - zu erhalten und es auf dem Bildschirm anzuzeigen (iPhone natürlich). Da das Rendern eines Layers in einem CGContext ein CPU-konsumierender Job ist, möchte ich nicht den Hauptthread verwenden, um die Benutzeroberfläche nicht anzuhalten.

Meine bisherigen Versuche waren:

  • Ich habe versucht, renderInContext auf der webView-Ebene auf UIGraphicalContext zu setzen, aber der _WebTryThreadLock -Fehler hat die Web-Views zum Absturz gebracht.

  • Ich habe versucht, ein CGBitmapContext zu erstellen und die Ebene der Webansicht darauf zu rendern, aber ich habe das gleiche Ergebnis erhalten.

  • Ich habe versucht, eine copy -Methode (durch Hinzufügen einer Kategorie) zu CALayer zu implementieren, die alle öffentlichen Eigenschaften und Sublayer tief kopiert hat. Danach habe ich versucht, renderInContext die Ebene zu kopieren, die ich kopiert habe. Ich habe ein UIImage, das teilweise "korrekt" war - was bedeutet, dass nicht alle Ebenen gerendert wurden, also würde ich zum Beispiel nur den Website-Header (oder Footer, oder Body oder Suchleiste, oder nur einige der Frames). Der Layer der UIWebview besteht aus allen Arten von CALayers, die sich in Unterklasse befinden. Dies ist wahrscheinlich der Grund, warum dies nicht funktioniert hat.

  • Ich habe versucht, kCATransactionDisableActions in CATransaction zu setzen, aber es scheint dieses Verhalten nicht zu ändern (keine von beiden).

Ich bin kurz davor aufzugeben.

Gibt es unter euch Menschen einen Retter?

    
Gilbert 11.01.2011, 18:07
quelle

2 Antworten

4

UIWebView hasst, und ich meine hasst wirklich , da in einem Hintergrundthread etwas dazu getan wurde. UIKit ist nicht vollständig Thread-sicher. Das Zeichnen in einen Grafikkontext ist (dies wurde in iOS 4 hinzugefügt), aber nicht das Erstellen von UIViews in einem sekundären Thread.

Erstellen Sie Ihre UIWebViews aus dem Hauptthread? Haben Sie vielleicht einen Code zum Teilen? Ich vermute, dass Ihre Probleme dadurch verursacht werden, dass Sie versuchen, Operationen an einem UIWebView in einem sekundären Thread auszuführen. Die Zeichenoperation zum Rendern des Inhalts der Ansicht als Bild kann außerhalb des Hauptthreads ausgeführt werden, die Erstellung der Ansicht selbst jedoch nicht.

    
lxt 11.01.2011, 19:41
quelle
0

Ich habe auch daran gearbeitet.

In einem Thread erstelle ich eine Ansichtshierarchie, Schleife, bis die Webansicht den Inhalt geladen hat.

Die von mir erstellte Webansicht befindet sich in der Viewdidload eines UIViewControllers - ich habe es versucht

%Vor%

Und ich habe das gleiche getan, um das webView freizugeben.

Aber das hat nicht funktioniert. Ich habe nur festgestellt, dass wir UIWebView-Ausnahmen vermeiden, bis wir den Autorelease-Pool erreicht haben ...

Ich benutze Instrumente, um warum herauszufinden.

Hier ist meine Angriffsstrategie ... Ich werde die Renderoperation für den Hauptthread mit einer Offscreen-Ansicht ausführen, wobei ein separater Thread eine Art von Warteschlange ausführt, um sie zu verwalten. Ich mache mir Sorgen um die UI-Verzögerung, also muss es ziemlich effizient sein.

    
user438350 29.06.2011 16:21
quelle