Ich habe einen UIWebView
mit unterschiedlichen (einseitigen) Inhalten. Ich möchte CGSize
den Inhalt herausfinden, um die Größe meiner übergeordneten Ansichten entsprechend zu ändern. Das Offensichtliche gibt -sizeThatFits:
leider nur die aktuelle Frame-Größe der WebView zurück.
116
Antworten:
Es stellte sich heraus, dass meine erste Vermutung
-sizeThatFits:
nicht völlig falsch war. Es scheint zu funktionieren, aber nur, wenn der Frame der WebView vor dem Senden auf eine minimale Größe eingestellt ist-sizeThatFits:
. Danach können wir die falsche Rahmengröße durch die Anpassungsgröße korrigieren. Das klingt schrecklich, ist aber eigentlich gar nicht so schlecht. Da wir beide Frame-Änderungen direkt nacheinander vornehmen, wird die Ansicht nicht aktualisiert und flackert nicht.Natürlich müssen wir warten, bis der Inhalt geladen wurde, also fügen wir den Code in die
-webViewDidFinishLoad:
Delegate-Methode ein.Obj-C
Swift 4.x.
Ich sollte darauf hinweisen, dass es einen anderen Ansatz gibt (danke @GregInYEG), der JavaScript verwendet. Ich bin mir nicht sicher, welche Lösung besser funktioniert.
Von zwei hackigen Lösungen gefällt mir diese besser.
quelle
UIWebView
Ansicht höher als Ihre übergeordnete Ansicht ist, müssen Sie sie in eine einbettenUIScrollView
.Ich habe eine andere Lösung, die großartig funktioniert.
Einerseits funktioniert Ortwins Ansatz und Lösung nur mit iOS 6.0 und höher, aber unter iOS 5.0, 5.1 und 5.1.1 nicht richtig, und andererseits gibt es etwas, das ich nicht mag und nicht verstehen kann Bei Ortwins Ansatz wird die Methode
[webView sizeThatFits:CGSizeZero]
mit dem Parameter verwendetCGSizeZero
: Wenn Sie die offizielle Dokumentation von Apple zu diesen Methoden und ihren Parametern lesen, heißt es deutlich:Was ich damit meine ist, dass es so ist, als wäre er ohne Logik auf seine Lösung gestoßen, denn beim Lesen der Dokumentation sollte der übergebene Parameter
[webView sizeThatFits: ...]
zumindest den gewünschten habenwidth
. Bei seiner Lösung wird die gewünschte Breite auf denwebView
Frame des Frames gesetzt, bevorsizeThatFits
mit einemCGSizeZero
Parameter aufgerufen wird. Ich behaupte also, dass diese Lösung "zufällig" auf iOS 6 funktioniert.Ich stellte mir einen rationaleren Ansatz vor, der den Vorteil hat, für iOS 5.0 und höher zu arbeiten ... Und auch in komplexen Situationen, in denen mehr als ein WebView (mit seiner Eigenschaft
webView.scrollView.scrollEnabled = NO
in a eingebettet ist)scrollView
.Hier ist mein Code , um das Layout der zu zwingen ,
webView
auf den gewünschtenwidth
und erhält die entsprechendenheight
Satz zurück in diewebView
selbst:Obj-C
Swift 4.x.
Beachten Sie, dass in meinem Beispiel das
webView
in eine benutzerdefiniertescrollView
Datei mit anderen eingebettet warwebViews
... Alle diesewebViews
hatten ihrewebView.scrollView.scrollEnabled = NO
, und der letzte Code, den ich hinzufügen musste, war die Berechnungheight
dercontentSize
von meiner benutzerdefiniertenscrollView
Einbettung dieserwebViews
, aber es war genauso einfach als Summieren meineswebView
‚sframe.size.height
mit dem Trick berechnet wie oben beschrieben ...quelle
-[UIWebView scrollView]
ist nur in iOS 5.0 oder höher verfügbar.Wiederbelebung dieser Frage, weil ich gefunden habe, dass Ortwins Antwort nur die meiste Zeit funktioniert ...
Die
webViewDidFinishLoad
Methode kann mehrmals aufgerufen werden, und der erste von zurückgegebene WertsizeThatFits
ist nur ein Teil der endgültigen Größe. Dann, aus welchem Grund auch immer, gibt der nächste Aufruf beisizeThatFits
erneutemwebViewDidFinishLoad
Brennen fälschlicherweise den gleichen Wert zurück wie zuvor! Dies geschieht zufällig für denselben Inhalt, als ob es sich um ein Parallelitätsproblem handelt. Vielleicht hat sich dieses Verhalten im Laufe der Zeit geändert, weil ich für iOS 5 baue und festgestellt habe, dass diessizeToFit
auf die gleiche Weise funktioniert (obwohl dies zuvor nicht der Fall war?).Ich habe mich für diese einfache Lösung entschieden:
Schnell (2.2):
Update: Ich habe festgestellt, dass dies, wie in den Kommentaren erwähnt, nicht den Fall erfasst, in dem der Inhalt geschrumpft ist. Sie sind sich nicht sicher, ob dies für alle Inhalte und Betriebssystemversionen gilt. Probieren Sie es aus.
quelle
webView.scalesPageToFit = YES
wie im obigen Kommentar erwähnt @Sijo angeben.In Xcode 8 und iOS 10, um die Höhe einer Webansicht zu bestimmen. Sie können Höhe mit bekommen
ODER für Swift
quelle
Eine einfache Lösung wäre, nur zu verwenden,
webView.scrollView.contentSize
aber ich weiß nicht, ob dies mit JavaScript funktioniert. Wenn kein JavaScript verwendet wird, funktioniert dies mit Sicherheit:quelle
Mit AFAIK können
[webView sizeThatFits:CGSizeZero]
Sie die Inhaltsgröße ermitteln.quelle
Das ist komisch!
Getestet habe ich die Lösungen sowohl
sizeThatFits:
und[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"]
sind nicht für mich arbeiten.Ich fand jedoch einen interessanten einfachen Weg, um die richtige Höhe des Webseiteninhalts zu erhalten. Derzeit habe ich es in meiner Delegatenmethode verwendet
scrollViewDidScroll:
.Verifiziert in iOS 9.3 Simulator / Gerät, viel Glück!
BEARBEITEN:
Hintergrund: Der HTML-Inhalt wird anhand meiner Zeichenfolgenvariablen und der HTTP-Inhaltsvorlage berechnet, die nach Methoden geladen werden
loadHTMLString:baseURL:
und keine registrierten JS-Skripte enthalten.quelle
Für iOS10, ich war immer 0 (Null) Wert ,
document.height
sodocument.body.scrollHeight
ist die Lösung Höhe von Dokumenten Webview zu bekommen. Das Problem kann auch für behoben werdenwidth
.quelle
Ich verwende eine
UIWebView
, die keine Unteransicht ist (und daher nicht Teil der Fensterhierarchie ist), um die Größe des HTML-Inhalts für zu bestimmenUITableViewCells
. Ich habe festgestellt, dass derUIWebView
nicht verbundene Benutzer seine Größe nicht richtig mit meldet-[UIWebView sizeThatFits:]
. Wie unter https://stackoverflow.com/a/3937599/9636 erwähnt , müssen Sie außerdem dieUIWebView
Werteframe
height
auf 1 setzen, um überhaupt die richtige Höhe zu erhalten.Wenn die
UIWebView
Höhe zu groß ist (dh Sie haben sie auf 1000 gesetzt, aber die HTML-Inhaltsgröße beträgt nur 500):Alle geben eine
height
von 1000 zurück.Um mein Problem in diesem Fall zu lösen, habe ich https://stackoverflow.com/a/11770883/9636 verwendet , das ich pflichtbewusst gewählt habe. Ich verwende diese Lösung jedoch nur, wenn meine
UIWebView.frame.width
mit der identisch ist-[UIWebView sizeThatFits:]
width
.quelle
Keiner der Vorschläge hier half mir in meiner Situation, aber ich las etwas, das mir eine Antwort gab. Ich habe einen ViewController mit einem festen Satz von UI-Steuerelementen, gefolgt von einem UIWebView. Ich wollte, dass die gesamte Seite gescrollt wird, als ob die Steuerelemente der Benutzeroberfläche mit dem HTML-Inhalt verbunden wären. Daher deaktiviere ich das Scrollen in der UIWebView und muss dann die Inhaltsgröße einer übergeordneten Bildlaufansicht korrekt festlegen.
Der wichtige Tipp stellte sich heraus, dass UIWebView seine Größe erst dann korrekt meldet, wenn es auf dem Bildschirm gerendert wird. Wenn ich den Inhalt lade, stelle ich die Inhaltsgröße auf die verfügbare Bildschirmhöhe ein. Dann aktualisiere ich in viewDidAppear die Inhaltsgröße der Bildlaufansicht auf den richtigen Wert. Dies hat bei mir funktioniert, weil ich loadHTMLString für lokale Inhalte aufrufe. Wenn Sie loadRequest verwenden, müssen Sie möglicherweise auch die contentSize in webViewDidFinishLoad aktualisieren, je nachdem, wie schnell das HTML abgerufen wird.
Es gibt kein Flackern, da nur der unsichtbare Teil der Bildlaufansicht geändert wird.
quelle
webViewDidFinishLoad
den sicheren Ansatz verlassen.Wenn Ihr HTML enthält schwere HTML-Inhalte wie iframe ist (dh Facebook-, Twitter, instagram-Einbettungen) die wirkliche Lösung ist viel schwieriger, zuerst wickeln Sie Ihre HTML:
Fügen Sie dann das Handling x-update-webview-height -scheme zu Ihrem shouldStartLoadWithRequest hinzu :
Fügen Sie abschließend den folgenden Code in Ihre layoutSubviews ein :
PS Sie können Zeitverzögerungen (SetTimeout und setInterval) in Ihrem ObjectiveC / Swift-Code implementieren - es liegt an Ihnen.
PSS Wichtige Informationen zu UIWebView- und Facebook-Einbettungen: Eingebettete Facebook-Beiträge werden in UIWebView nicht richtig angezeigt
quelle
Wenn Sie die Webansicht als Unteransicht irgendwo in der Bildlaufansicht verwenden, können Sie die Höhenbeschränkung auf einen konstanten Wert festlegen und später einen Ausgang daraus erstellen und ihn wie folgt verwenden:
quelle
Ich bin auch bei diesem Problem festgefahren, dann wurde mir klar, dass ich, wenn ich die dynamische Höhe der WebView berechnen möchte, zuerst die Breite der WebView angeben muss, also füge ich eine Zeile vor js hinzu und es stellt sich heraus, dass ich sie bekommen kann sehr genaue tatsächliche Höhe.
Der Code ist einfach so:
quelle
Xcode8 swift3.1:
webViewDidFinishLoad
Delegierten:let height = webView.scrollView.contentSize.height
Ohne web1 gibt Schritt 2, wenn webview.height> actual contentHeight, webview.height zurück, jedoch nicht contentize.height.
quelle
Fügen Sie dies auch in iOS 7 für die ordnungsgemäße Funktion aller genannten Methoden in Ihre View Controller-
viewDidLoad
Methode ein:Andernfalls würde keine der Methoden so funktionieren, wie sie sollte.
quelle