In a UITextView i can resize the height of the control to it's content like this:
CGRect frame = textView.frame;
frame.size.height = textView.contentSize.height;
textView.frame = frame;
But i want to use an UIWebView instead in order to show rich text. The UIWebVie's content is:
NSString *myDescriptionHTML = [NSString stringWithFormat:@"<html> \n"
"<head> \n"
"<style type=\"text/css\"> \n"
"body {font-family: \"%@\"; font-size: %@; }\n"
"</style> \n"
"</head> \n"
"<body>%@</body> \n"
"</html>", @"helvetica",
[NSNumber numberWithInt:12], @"yadayadayada..."];
[webView loadHTMLString:myDescriptionHTML baseURL:nil];
So the UIWebView contains nothing but plain text. How can i achieve result similar to the above UITextView code?
Although in theory the JavaScript method provided
- (void)webViewDidFinishLoad:(UIWebView *)webview
CGRect oldBounds = [[self webview] bounds];
CGFloat height = [[webview stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue];
[webview setBounds:CGRectMake(oldBounds.x, oldBounds.y, oldBounds.width, height)];
}
should work (and seems to work for most people), it just didn't for me. I tried with a number of variation and it always returned a size that has nothing to do with the true content's height. A one liner would come up with 260 or 244 height, for instance. Don't know why (would love to know).
SO i ended up doing as hinted in this answer:
- (void)webViewDidFinishLoad:(UIWebView *)aWebView {
CGRect frame = aWebView.frame;
frame.size.height = 1;
aWebView.frame = frame;
CGSize fittingSize = [aWebView sizeThatFits:CGSizeZero];
frame.size = fittingSize;
aWebView.frame = frame;
NSLog(@"size: %f, %f", fittingSize.width, fittingSize.height);
}
I think the JS way more elegant but hell, it doesn't works for me and can't figure out why, while this method worked out of the box.
Similar to what Micheal suggested, you should be able to get the height of the content by making a call to javascript in the webview's webViewDidFinishLoad
callback
ex (untested):
- (void)webViewDidFinishLoad:(UIWebView *)webview
CGRect oldBounds = [[self webview] bounds];
CGFloat height = [[webview stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue];
[webview setBounds:CGRectMake(oldBounds.x, oldBounds.y, oldBounds.width, height)];
}
This is based on a method used in Appcelerator Titanium to resize its webviews based on height if the user sets height to "auto" https://github.com/appcelerator/titanium_mobile/blob/master/iphone/Classes/TiUIWebView.m#L616
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With