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ámetro CGSizeZero
: Si lee la documentación oficial de Apple sobre estos métodos y su parámetro, dice claramente:
La implementación predeterminada de este método devuelve la porción de tamaño del rectángulo de límites de la vista. Las subclases pueden anular este método para devolver un valor personalizado basado en el diseño deseado de cualquier subvista. Por ejemplo, un objeto UISwitch devuelve un valor de tamaño fijo que representa el tamaño estándar de una vista de conmutador y un objeto UIImageView devuelve el tamaño de la imagen que se muestra actualmente.
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 deseado width
. Con su solución, el ancho deseado se establece en el webView
marco de antes de llamar sizeThatFits
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 un scrollView
.
Aquí está mi código para forzar el diseño del webView
la deseada width
y obtener el height
conjunto correspondiente de nuevo a webView
sí mismo:
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;
}
Tenga en cuenta que en mi ejemplo, el webView
fue incorporado en una costumbre scrollView
que tiene otro webViews
... Todos estos webViews
tuvieron su webView.scrollView.scrollEnabled = NO
, y el último trozo de código que tenía que añadir es el cálculo de la height
de la contentSize
de mi costumbre scrollView
incrustación de éstos webViews
, pero fue tan fácil como la suma de mi webView
's frame.size.height
calculada con el truco descrito anteriormente ...