Eu tenho um UIWebView
conteúdo diferente (página única). Eu gostaria de descobrir o CGSize
do conteúdo para redimensionar minhas visualizações pai apropriadamente. O óbvio, -sizeThatFits:
infelizmente, apenas retorna o tamanho do quadro atual do webView.
116
Respostas:
Acontece que meu primeiro palpite usando
-sizeThatFits:
não estava completamente errado. Parece funcionar, mas apenas se o quadro do webView for definido com um tamanho mínimo antes do envio-sizeThatFits:
. Depois disso, podemos corrigir o tamanho do quadro errado pelo tamanho do encaixe. Isso parece terrível, mas na verdade não é tão ruim. Como fazemos as duas mudanças de quadro uma após a outra, a visualização não é atualizada e não pisca.Claro, temos que esperar até que o conteúdo seja carregado, então colocamos o código no
-webViewDidFinishLoad:
método delegado.Obj-C
Swift 4.x
Devo salientar que há outra abordagem (obrigado @GregInYEG) usando JavaScript. Não tenho certeza de qual solução tem melhor desempenho.
De duas soluções hacky, gosto mais desta.
fonte
UIWebView
visão for superior à de seus pais, você precisa incorporá-la a umUIScrollView
.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âmetroCGSizeZero
: Se você ler a documentação oficial da Apple sobre esses métodos e seus parâmetros, diz claramente: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 desejadowidth
. Com sua solução, a largura desejada é definida para owebView
quadro de antes de chamarsizeThatFits
com umCGSizeZero
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 umscrollView
.Aqui está meu código para forçar o Layout do
webView
para o desejadowidth
e obter oheight
conjunto correspondente de volta para owebView
próprio:Obj-C
Swift 4.x
Observe que no meu exemplo, o
webView
foi embutido em um customscrollView
tendo outroswebViews
... Todos esteswebViews
tinham seuswebView.scrollView.scrollEnabled = NO
, e a última parte do código que eu tive que adicionar foi o cálculo doheight
decontentSize
do meu customscrollView
embeding esteswebViews
, mas foi tão fácil como soma minhawebView
éframe.size.height
calculado com o truque descrito acima ...fonte
-[UIWebView scrollView]
está disponível apenas no iOS 5.0 ou posterior.Ressuscitando esta pergunta porque descobri que a resposta de Ortwin só funciona na MAIORIA do tempo ...
O
webViewDidFinishLoad
método pode ser chamado mais de uma vez, e o primeiro valor retornado porsizeThatFits
é apenas uma parte do tamanho final que deve ser. Então, por qualquer motivo, a próxima chamada parasizeThatFits
quandowebViewDidFinishLoad
disparar novamente retornará incorretamente o mesmo valor que fazia antes! Isso acontecerá aleatoriamente para o mesmo conteúdo, como se fosse algum tipo de problema de simultaneidade. Talvez esse comportamento tenha mudado com o tempo, porque estou compilando para iOS 5 e também descobri quesizeToFit
funciona da mesma maneira (embora anteriormente não funcionasse?)Eu escolhi esta solução simples:
Swift (2.2):
Atualização: descobri, conforme mencionado nos comentários, que isso não parece pegar o caso em que o conteúdo foi reduzido. Não tenho certeza se isso é verdade para todo o conteúdo e versão do sistema operacional, experimente.
fonte
webView.scalesPageToFit = YES
como @Sijo mencionado no comentário acima.No Xcode 8 e iOS 10 para determinar a altura de uma visualização da web. você pode obter altura usando
OU para Swift
fonte
Uma solução simples seria apenas usar,
webView.scrollView.contentSize
mas não sei se isso funciona com JavaScript. Se não houver JavaScript usado, isso funciona com certeza:fonte
AFAIK você pode usar
[webView sizeThatFits:CGSizeZero]
para descobrir o tamanho do conteúdo.fonte
Isso é estranho!
Eu testei as soluções
sizeThatFits:
e NÃO[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"]
estão funcionando para mim.No entanto, descobri uma maneira fácil e interessante de obter a altura certa do conteúdo da página da web. Atualmente, eu usei no meu método delegado
scrollViewDidScroll:
.Verificado no simulador / dispositivo iOS 9.3, boa sorte!
EDITAR:
Background: O conteúdo html é calculado pela minha variável de string e modelo de conteúdo HTTP, carregado pelo método
loadHTMLString:baseURL:
, sem scripts JS registrados lá.fonte
Para iOS10, eu estava obtendo o valor 0 (zero) de
document.height
entãodocument.body.scrollHeight
é a solução para obter a altura do documento no Webview. O problema também pode ser resolvido parawidth
.fonte
Estou usando um
UIWebView
que não é uma subvisualização (e, portanto, não faz parte da hierarquia da janela) para determinar os tamanhos do conteúdo HTMLUITableViewCells
. Descobri que o desconectadoUIWebView
não informa seu tamanho corretamente com-[UIWebView sizeThatFits:]
. Além disso, conforme mencionado em https://stackoverflow.com/a/3937599/9636 , você deve definir oUIWebView
'sframe
height
como 1 para obter a altura adequada.Se a
UIWebView
altura de for muito grande (ou seja, você configurou para 1000, mas o tamanho do conteúdo HTML é de apenas 500):Todos retornam
height
1000.Para resolver meu problema neste caso, usei https://stackoverflow.com/a/11770883/9636 , que votei obedientemente. No entanto, só uso essa solução quando meu
UIWebView.frame.width
é igual ao-[UIWebView sizeThatFits:]
width
.fonte
Nenhuma das sugestões aqui me ajudou com minha situação, mas li algo que me deu uma resposta. Eu tenho um ViewController com um conjunto fixo de controles de IU seguido por um UIWebView. Eu queria que a página inteira rolasse como se os controles da IU estivessem conectados ao conteúdo HTML, então eu desabilito a rolagem no UIWebView e devo então definir o tamanho do conteúdo de uma exibição de rolagem pai corretamente.
A dica importante acabou sendo que o UIWebView não informa seu tamanho corretamente até que seja processado na tela. Portanto, quando carrego o conteúdo, defino o tamanho do conteúdo para a altura de tela disponível. Então, em viewDidAppear eu atualizo o tamanho do conteúdo do scrollview para o valor correto. Isso funcionou para mim porque estou chamando loadHTMLString no conteúdo local. Se você estiver usando loadRequest, pode ser necessário atualizar o contentSize em webViewDidFinishLoad também, dependendo da rapidez com que o html é recuperado.
Não há oscilação, porque apenas a parte invisível da visualização de rolagem é alterada.
fonte
webViewDidFinishLoad
a abordagem segura.Se o seu HTML contiver conteúdo HTML pesado como o de iframe (ou seja, facebook, twitter, instagram-embols), a solução real é muito mais difícil, primeiro envolva seu HTML:
Em seguida, adicione manipulação x-update-webview-height -scheme em seu shouldStartLoadWithRequest :
E, finalmente, adicione o seguinte código dentro de seu layoutSubviews :
PS Você pode implementar o retardo de tempo (SetTimeout e setInterval) dentro do seu código ObjectiveC / Swift - você decide.
PSS Informações importantes sobre UIWebView e incorporações do Facebook: a postagem incorporada do Facebook não é exibida corretamente em UIWebView
fonte
Ao usar o webview como uma subvisualização em algum lugar em scrollview, você pode definir a restrição de altura para algum valor constante e, posteriormente, fazer uma saída a partir dele e usá-lo como:
fonte
Eu também estou preso neste problema, então percebi que se eu quiser calcular a altura dinâmica do webView, preciso informar a largura do webView primeiro, então adiciono uma linha antes de js e descubro que posso obter altura real muito precisa.
O código é simples assim:
fonte
Xcode8 swift3.1:
webViewDidFinishLoad
Delegado:let height = webView.scrollView.contentSize.height
Sem a etapa 1, se webview.height> real contentHeight, a etapa 2 retornará webview.height, mas não contentsize.height.
fonte
Também no iOS 7, para o funcionamento adequado de todos os métodos mencionados, adicione isso ao
viewDidLoad
método do controlador de visualização :Caso contrário, nenhum dos métodos funcionaria como deveria.
fonte