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 webView
frame di prima di chiamare sizeThatFits
con un CGSizeZero
parametro. 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 webView
desiderato width
e riportare il height
set corrispondente a webView
se 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 scrollView
con altri webViews
... Tutti questi webViews
hanno avuto il loro webView.scrollView.scrollEnabled = NO
, e l'ultimo pezzo di codice ho dovuto aggiungere è stato il calcolo del height
del contentSize
del mio personalizzato scrollView
incorporare questi webViews
, ma è stato così facile come sommando il mio webView
's frame.size.height
calcolata con il trucco descritto sopra ...