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 verwendet CGSizeZero: Wenn Sie die offizielle Dokumentation von Apple zu diesen Methoden und ihren Parametern lesen, heißt es deutlich:
Die Standardimplementierung dieser Methode gibt den Größenbereich des Begrenzungsrechtecks der Ansicht zurück. Unterklassen können diese Methode überschreiben, um einen benutzerdefinierten Wert basierend auf dem gewünschten Layout aller Unteransichten zurückzugeben. Beispielsweise gibt ein UISwitch-Objekt einen festen Größenwert zurück, der die Standardgröße einer Switch-Ansicht darstellt, und ein UIImageView-Objekt gibt die Größe des aktuell angezeigten Bildes zurück.
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 haben width. Bei seiner Lösung wird die gewünschte Breite auf den webViewFrame des Frames gesetzt, bevor sizeThatFitsmit einem CGSizeZeroParameter 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 = NOin a eingebettet ist) scrollView.
Hier ist mein Code , um das Layout der zu zwingen , webViewauf den gewünschten widthund erhält die entsprechenden heightSatz zurück in die webViewselbst:
Obj-C
- (void)webViewDidFinishLoad:(UIWebView *)aWebView
{
aWebView.scrollView.scrollEnabled = NO; // Property available in iOS 5.0 and later
CGRect frame = aWebView.frame;
frame.size.width = 200; // Your desired width here.
frame.size.height = 1; // Set the height to a small one.
aWebView.frame = frame; // Set webView's Frame, forcing the Layout of its embedded scrollView with current Frame's constraints (Width set above).
frame.size.height = aWebView.scrollView.contentSize.height; // Get the corresponding height from the webView's embedded scrollView.
aWebView.frame = frame; // Set the scrollView contentHeight back to the frame itself.
}
Swift 4.x.
func webViewDidFinishLoad(_ aWebView: UIWebView) {
aWebView.scrollView.isScrollEnabled = false
var frame = aWebView.frame
frame.size.width = 200
frame.size.height = 1
aWebView.frame = frame
frame.size.height = aWebView.scrollView.contentSize.height
aWebView.frame = frame;
}
Beachten Sie, dass in meinem Beispiel das webViewin eine benutzerdefinierte scrollViewDatei mit anderen eingebettet war webViews... Alle diese webViewshatten ihre webView.scrollView.scrollEnabled = NO, und der letzte Code, den ich hinzufügen musste, war die Berechnung heightder contentSizevon meiner benutzerdefinierten scrollViewEinbettung dieser webViews, aber es war genauso einfach als Summieren meines webView‚s frame.size.heightmit dem Trick berechnet wie oben beschrieben ...