Ho un'altra soluzione che funziona alla grande.
Da un lato, l'approccio e la soluzione di Ortwin funziona solo con iOS 6.0 e versioni successive, ma non funziona correttamente su iOS 5.0, 5.1 e 5.1.1, e dall'altro c'è qualcosa che non mi piace e non riesco a capire con l'approccio di Ortwin, è l'uso del metodo [webView sizeThatFits:CGSizeZero]con il parametro CGSizeZero: se leggi la documentazione ufficiale Apple su questo metodo e il suo parametro, dice chiaramente:
L'implementazione predefinita di questo metodo restituisce la parte delle dimensioni del rettangolo dei limiti della vista. Le sottoclassi possono sovrascrivere questo metodo per restituire un valore personalizzato basato sul layout desiderato di tutte le sottovisioni. Ad esempio, un oggetto UISwitch restituisce un valore di dimensione fissa che rappresenta la dimensione standard di una vista switch e un oggetto UIImageView restituisce la dimensione dell'immagine che sta attualmente visualizzando.
Quello che voglio dire è che è come se fosse imbattuto nella sua soluzione senza alcuna logica, perché leggendo la documentazione, il parametro passato a [webView sizeThatFits: ...]dovrebbe almeno avere il desiderato width. Con la sua soluzione, la larghezza desiderata viene impostata sul webViewframe di prima di chiamare sizeThatFitscon un CGSizeZeroparametro. Quindi ritengo che questa soluzione funzioni su iOS 6 "per caso".
Ho immaginato un approccio più razionale, che ha il vantaggio di funzionare per iOS 5.0 e versioni successive ... E anche in situazioni complesse in cui più di una webView (con la sua proprietà webView.scrollView.scrollEnabled = NOè incorporata in un file scrollView.
Ecco il mio codice per forzare il layout del layout webViewdesiderato widthe riportare il heightset corrispondente a webViewse stesso:
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;
}
Si noti che nel mio esempio, il webViewè stato incorporato in un costume scrollViewcon altri webViews... Tutti questi webViewshanno avuto il loro webView.scrollView.scrollEnabled = NO, e l'ultimo pezzo di codice ho dovuto aggiungere è stato il calcolo del heightdel contentSizedel mio personalizzato scrollViewincorporare questi webViews, ma è stato così facile come sommando il mio webView's frame.size.heightcalcolata con il trucco descritto sopra ...