Tengo un contenido UIWebView
diferente (de una sola página). Me gustaría averiguar CGSize
el contenido para cambiar el tamaño de las vistas de mis padres de manera adecuada. -sizeThatFits:
Desafortunadamente, lo obvio solo devuelve el tamaño de fotograma actual de webView.
116
Respuestas:
Resultó que mi primera conjetura al utilizar
-sizeThatFits:
no estaba del todo mal. Parece funcionar, pero solo si el marco de webView se establece en un tamaño mínimo antes del envío-sizeThatFits:
. Después de eso, podemos corregir el tamaño de marco incorrecto según el tamaño de ajuste. Esto suena terrible, pero en realidad no es tan malo. Como hacemos ambos cambios de fotogramas uno tras otro, la vista no se actualiza y no parpadea.Por supuesto, tenemos que esperar hasta que se haya cargado el contenido, por lo que colocamos el código en el
-webViewDidFinishLoad:
método delegado.Obj-C
Swift 4.x
Debo señalar que hay otro enfoque (gracias @GregInYEG) usando JavaScript. No estoy seguro de qué solución funciona mejor.
De dos soluciones hacky, me gusta más esta.
fuente
UIWebView
es más alta que la vista principal, debe insertarla en un archivoUIScrollView
.Tengo otra solución que funciona muy bien.
Por un lado, el enfoque y la solución de Ortwin solo funciona con iOS 6.0 y posterior, pero no funciona correctamente en iOS 5.0, 5.1 y 5.1.1, y por otro lado hay algo que no me gusta y no puedo entender. con el enfoque de Ortwin, es el uso del método
[webView sizeThatFits:CGSizeZero]
con el parámetroCGSizeZero
: Si lee la documentación oficial de Apple sobre estos métodos y su parámetro, dice claramente:Lo que quiero decir es que es como si se hubiera encontrado con su solución sin ninguna lógica, porque al leer la documentación, el parámetro pasado
[webView sizeThatFits: ...]
debería tener al menos el deseadowidth
. Con su solución, el ancho deseado se establece en elwebView
marco de antes de llamarsizeThatFits
con unCGSizeZero
parámetro. Así que mantengo que esta solución funciona en iOS 6 por "casualidad".Imaginé un enfoque más racional, que tiene la ventaja de funcionar para iOS 5.0 y posterior ... Y también en situaciones complejas donde más de un webView (con su propiedad
webView.scrollView.scrollEnabled = NO
está incrustado en unscrollView
.Aquí está mi código para forzar el diseño del
webView
la deseadawidth
y obtener elheight
conjunto correspondiente de nuevo awebView
sí mismo:Obj-C
Swift 4.x
Tenga en cuenta que en mi ejemplo, el
webView
fue incorporado en una costumbrescrollView
que tiene otrowebViews
... Todos estoswebViews
tuvieron suwebView.scrollView.scrollEnabled = NO
, y el último trozo de código que tenía que añadir es el cálculo de laheight
de lacontentSize
de mi costumbrescrollView
incrustación de éstoswebViews
, pero fue tan fácil como la suma de miwebView
'sframe.size.height
calculada con el truco descrito anteriormente ...fuente
-[UIWebView scrollView]
está disponible solo en iOS 5.0 o posterior.Resucitando esta pregunta porque encontré que la respuesta de Ortwin solo funciona la MAYORÍA del tiempo ...
El
webViewDidFinishLoad
método se puede llamar más de una vez, y el primer valor devuelto porsizeThatFits
es solo una parte del tamaño final que debería ser. Entonces, por cualquier motivo, la próxima llamada asizeThatFits
whenwebViewDidFinishLoad
fires again devolverá incorrectamente el mismo valor que antes. Esto sucederá aleatoriamente para el mismo contenido como si fuera algún tipo de problema de concurrencia. Quizás este comportamiento haya cambiado con el tiempo, porque estoy compilando para iOS 5 y también he descubierto quesizeToFit
funciona de la misma manera (¿aunque anteriormente esto no funcionaba?)Me he decidido por esta sencilla solución:
Rápido (2.2):
Actualización: He descubierto que, como se menciona en los comentarios, esto no parece detectar el caso en el que el contenido se ha reducido. No estoy seguro si es cierto para todo el contenido y la versión del sistema operativo, pruébalo.
fuente
webView.scalesPageToFit = YES
como @Sijo mencionado en el comentario anterior.En Xcode 8 y iOS 10 para determinar la altura de una vista web. puedes obtener altura usando
O para Swift
fuente
Una solución simple sería simplemente usar,
webView.scrollView.contentSize
pero no sé si esto funciona con JavaScript. Si no se utiliza JavaScript, esto funciona con seguridad:fuente
AFAIK puede usar
[webView sizeThatFits:CGSizeZero]
para averiguar el tamaño del contenido.fuente
¡Esto es raro!
He probado las soluciones tanto
sizeThatFits:
y[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"]
están NO trabajando para mí.Sin embargo, encontré una manera fácil e interesante de obtener la altura correcta del contenido de la página web. Actualmente, lo usé en mi método delegado
scrollViewDidScroll:
.Verificado en el Simulador / Dispositivo iOS 9.3, ¡buena suerte!
EDITAR:
Antecedentes: el contenido html se calcula mediante mi variable de cadena y la plantilla de contenido HTTP, cargada por método
loadHTMLString:baseURL:
, no hay scripts JS registrados allí.fuente
Para iOS10, obtenía el valor 0 (cero),
document.height
así quedocument.body.scrollHeight
es la solución para obtener la altura del documento en Webview. El problema también se puede resolver parawidth
.fuente
Estoy usando una
UIWebView
que no es una subvista (y, por lo tanto, no forma parte de la jerarquía de ventanas) para determinar los tamaños del contenido HTMLUITableViewCells
. Descubrí que el desconectadoUIWebView
no informa su tamaño correctamente con-[UIWebView sizeThatFits:]
. Además, como se menciona en https://stackoverflow.com/a/3937599/9636 , debe establecer elUIWebView
'sframe
height
en 1 para obtener la altura adecuada.Si la
UIWebView
altura del 'es demasiado grande (es decir, lo tiene configurado en 1000, pero el tamaño del contenido HTML es solo 500):Todos devuelven un valor
height
de 1000.Para resolver mi problema en este caso, utilicé https://stackoverflow.com/a/11770883/9636 , que debidamente voté a favor. Sin embargo, solo uso esta solución cuando mi
UIWebView.frame.width
es el mismo que el-[UIWebView sizeThatFits:]
width
.fuente
Ninguna de las sugerencias aquí me ayudó con mi situación, pero leí algo que me dio una respuesta. Tengo un ViewController con un conjunto fijo de controles de IU seguido de un UIWebView. Quería que toda la página se desplazara como si los controles de la interfaz de usuario estuvieran conectados al contenido HTML, por lo que desactivo el desplazamiento en UIWebView y luego debo configurar correctamente el tamaño del contenido de una vista de desplazamiento principal.
El consejo importante resultó ser que UIWebView no informa su tamaño correctamente hasta que se muestra en la pantalla. Entonces, cuando cargo el contenido, configuro el tamaño del contenido a la altura de pantalla disponible. Luego, en viewDidAppear actualizo el tamaño del contenido de scrollview al valor correcto. Esto funcionó para mí porque estoy llamando a loadHTMLString en contenido local. Si está utilizando loadRequest, es posible que también deba actualizar contentSize en webViewDidFinishLoad, dependiendo de la rapidez con que se recupere el html.
No hay parpadeo, porque solo se cambia la parte invisible de la vista de desplazamiento.
fuente
webViewDidFinishLoad
el enfoque seguro.Si su HTML contiene contenido HTML pesado como iframe (es decir, Facebook, Twitter, Instagram), la solución real es mucho más difícil, primero envuelva su HTML:
Luego agregue el manejo x-update-webview-height -scheme en su shouldStartLoadWithRequest :
Y finalmente agregue el siguiente código dentro de su layoutSubviews :
PD: Puede implementar el retardo de tiempo (SetTimeout y setInterval) dentro de su código ObjectiveC / Swift, depende de usted.
PSS Información importante sobre UIWebView y Facebook Embeds: la publicación de Facebook incrustada no se muestra correctamente en UIWebView
fuente
Al usar la vista web como una subvista en algún lugar de la vista de desplazamiento, puede establecer la restricción de altura en un valor constante y luego hacer una salida y usarla como:
fuente
También estoy atascado en este problema, luego me di cuenta de que si quiero calcular la altura dinámica de webView, primero necesito indicar el ancho de webView, así que agrego una línea antes de js y resulta que puedo obtener altura real muy precisa.
El código es tan simple como este:
fuente
Xcode8 swift3.1:
webViewDidFinishLoad
Delegado:let height = webView.scrollView.contentSize.height
Sin el paso 1, si webview.height> real contentHeight, el paso 2 devolverá webview.height pero no contentsize.height.
fuente
También en iOS 7 para el correcto funcionamiento de todos los métodos mencionados, agregue esto en su
viewDidLoad
método de controlador de vista :De lo contrario, ninguno de los métodos funcionaría como debería.
fuente