Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Resize UIWebView to its content

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?

like image 696
ferostar Avatar asked May 24 '11 03:05

ferostar


2 Answers

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.

like image 149
ferostar Avatar answered Sep 19 '22 11:09

ferostar


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

like image 30
netpro2k Avatar answered Sep 21 '22 11:09

netpro2k