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 webView
quadro de antes de chamar sizeThatFits
com um CGSizeZero
parâ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 = NO
está embutido em um scrollView
.
Aqui está meu código para forçar o Layout do webView
para o desejado width
e obter o height
conjunto correspondente de volta para o webView
pró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 webView
foi embutido em um custom scrollView
tendo outros webViews
... Todos estes webViews
tinham seus webView.scrollView.scrollEnabled = NO
, e a última parte do código que eu tive que adicionar foi o cálculo do height
de contentSize
do meu custom scrollView
embeding estes webViews
, mas foi tão fácil como soma minha webView
é frame.size.height
calculado com o truque descrito acima ...