Eu tenho outra solução que funciona muito bem.
Por um lado, a abordagem e solução de Ortwin funciona apenas com iOS 6.0 e posterior, mas não funciona corretamente no iOS 5.0, 5.1 e 5.1.1 e, por outro lado, há algo que não gosto e não consigo entender com a abordagem de Ortwin, é o uso do método [webView sizeThatFits:CGSizeZero]com o parâmetro CGSizeZero: Se você ler a documentação oficial da Apple sobre esses métodos e seus parâmetros, diz claramente:
A implementação padrão deste método retorna a parte do tamanho do retângulo de limites da visualização. As subclasses podem substituir esse método para retornar um valor personalizado com base no layout desejado de quaisquer subvisualizações. Por exemplo, um objeto UISwitch retorna um valor de tamanho fixo que representa o tamanho padrão de uma visualização do switch e um objeto UIImageView retorna o tamanho da imagem que está exibindo no momento.
O que quero dizer é que é como se ele encontrasse sua solução sem nenhuma lógica, pois lendo a documentação, o parâmetro passado para [webView sizeThatFits: ...]deve ter pelo menos o desejado width. Com sua solução, a largura desejada é definida para o webViewquadro de antes de chamar sizeThatFitscom um CGSizeZeroparâmetro. Portanto, mantenho esta solução funcionando no iOS 6 por "acaso".
Imaginei uma abordagem mais racional, que tem a vantagem de funcionar para iOS 5.0 e posteriores ... E também em situações complexas onde mais de um webView (com sua propriedade webView.scrollView.scrollEnabled = NOestá embutido em um scrollView.
Aqui está meu código para forçar o Layout do webViewpara o desejado widthe obter o heightconjunto correspondente de volta para o webViewpróprio:
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;
}
Observe que no meu exemplo, o webViewfoi embutido em um custom scrollViewtendo outros webViews... Todos estes webViewstinham seus webView.scrollView.scrollEnabled = NO, e a última parte do código que eu tive que adicionar foi o cálculo do heightde contentSizedo meu custom scrollViewembeding estes webViews, mas foi tão fácil como soma minha webViewé frame.size.heightcalculado com o truque descrito acima ...