Meine Anwendung hat mehrere UIWebView-Ansichten in einem UIScrollView. Manchmal habe ich HTML-Inhalt, also lade ich das UIWebView mit der UIWebView loadHTMLString: baseURL: -Methode. Dies scheint kein Problem zu verursachen. Kürzlich habe ich begonnen, einige der UIWebView-Instanzen mit einer URL zu laden, die die Methode loadRequest: verwendet. Sobald ich damit angefangen habe, bekomme ich bei jedem Scrollen folgenden Fehler:
* Beenden der App aufgrund der nicht abgefangenen Ausnahme 'CALayerInvalidGeometry', Grund: 'CALayer position enthält NaN: [nan nan]'
Mit folgendem Stack-Trace:
%Vor%Ich habe mir die vielen Fragen und Antworten zu diesem Thema angeschaut und erkannt, dass Apple dies abhält, aber ich habe keine Antworten gesehen, die eine Alternative bieten.
Meine erste Frage: Gibt es eine alternative Möglichkeit, denselben Effekt zu erzielen?
Unten ist ein Ausschnitt davon, wie ich das UIWebView
erstelle %Vor%Wie Sie sehen können, deaktiviere ich das Scrollen und die Benutzereingabe für das UIWebView.
Meine zweite Frage: Warum bearbeitet das UIWebView (oder zumindest eine oder mehrere seiner Subviews) überhaupt Scrolling, wenn ich diese Funktionalität explizit deaktiviert habe?
Meine dritte Frage: Da es sowieso Scrollen zu behandeln scheint, gibt es eine andere Möglichkeit, die Scroll-Benachrichtigung abzufangen oder zu deaktivieren, die an das UIWebView gesendet wird?
Wie Sie sehen, beabsichtige ich nicht wirklich, den Benutzer mit dem Inhalt des UIWebView interagieren zu lassen - erlauben Sie ihm einfach, den Inhalt zu sehen.
In diesem Szenario wäre eine mögliche Alternative, ein UIWebView außerhalb von UIScrollView zu erstellen, das für den Benutzer nicht sichtbar ist, seinen Inhalt in ein Bild einzufügen und dann den Inhalt in einem UIImageView anzuzeigen? Wenn ja, wie würde ich den Inhalt des UIWebView in ein Bild aufnehmen?
BEARBEITEN: Ich fand eine Lösung dafür, die ziemlich einfach war. Laden Sie Ihr UIWebView grundsätzlich, fügen Sie es jedoch nicht als Unteransicht hinzu. Wenn das UIWebView geladen ist, erstellen Sie das Image mit dem folgenden Code:
%Vor%Ich wäre immer noch daran interessiert, die Antworten auf die Fragen 1 bis 3 zu hören. Wenn wir uns entscheiden, interaktive UIWebViews zu unterstützen, wird diese Lösung in Zukunft nicht funktionieren.
Irgendwelche Vorschläge?
Haben Sie diesen Code auf dem iOS-Simulator oder einem tatsächlichen Gerät getestet?
Ich habe kürzlich den gleichen Absturz beim Testen auf iOS 5.1 im Simulator erlebt, aber nicht den gleichen Absturz auf dem iPad / iPhone mit 5.1.
iOS 6 funktioniert auf Geräten genauso gut wie auf dem Simulator.
Ich glaube, dass dies auf eine UIWebView-Änderung in iOS 6 zurückzuführen ist. UIWebView wurde geändert, um seinen Inhalt jetzt asynchron zu zeichnen.
Überprüfen Sie die NaN-Werte, wenn Sie versuchen, die Eigenschaft mit zu setzen:
%Vor%Damit Sie die Werte richtig handhaben können, sobald Sie dies haben und Sie den Code ausführen können, wäre es gut herauszufinden, warum dies überhaupt passiert (ich würde eine dumme Berechnung erraten, wenn Sie den Wert erhalten, den Sie versuchen einstellen)
Auch hier ist das NaN erklärt: Ссылка
Eigentlich kann ich nur empfehlen, eine eigene "webview" -Klasse zu schreiben, die benutzerdefinierte NSURLConnection mit NSURLRequest im Hintergrund enthalten und WebView mit loadHTMLString initiieren würde. Ich habe viele Probleme mit WebView in Anwendungen. Es gibt also keine Lösung für den Aufruf von UIWebView loadRequest.
Es ist schwierig, dies ohne ein Beispielprojekt zu debuggen, mit dem man spielen kann. Ich bin mir also nicht sicher, was das verursacht. Ich würde Ihre Rahmenberechnungen überprüfen. Wenn Ihr Eltern-UIScrollView im Interface Builder ist, würde ich versuchen, Auto-Layout auszuschalten, um zu sehen, ob das einen Unterschied macht (da contentSize anders funktioniert).
Es gibt ein paar andere Dinge, die Sie ausprobieren könnten:
%Vor%Damit stellen Sie sicher, dass Ihre Eltern-Scroll-Ansicht immer Vorrang vor den Web-Views hat. Vielleicht verhindert das den Fehler überhaupt.
Je nachdem, wie Sie die Webansicht verwenden, gibt es einige situative Alternativen:
Rufen Sie renderInContext im UIWebView auf, um einen Screenshot zu erhalten, und verwenden Sie einfach ein UIImage. Nach dem Entfernen des UIWebView verwenden Sie weniger Speicher.
DTCoreText ermöglicht Ihnen die Verwendung von CoreText zum Rendern bestimmter HTML-Inhalte.
UIMarkupTextPrintFormatter
können Sie HTML-Inhalte "drucken". Es kann verwendet werden, um ein Bild zu erhalten.
Tags und Links ios uiwebview uiscrollview