ruhu
ruhu

Reputation: 81

Dynamic height of UIWebView with auto layout

I have a problem with setting the height of an UIWebView dynamically. The webview loads a product description which contains html. I want the UIWebView to change its height based on the contents of the description. The parent scrollview should also change its height, but then based on the height of the UIWebView.

Can anyone explain to me how I can achieve the desired behavior of my views?

This is my view hierarchy:

enter image description here

Upvotes: 7

Views: 13268

Answers (3)

AJ112
AJ112

Reputation: 5301

You have to add some code in the delegate method of UIWebView named webViewDidFinishLoad. Here is what you can do:

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
      CGRect frame = webView.frame;
      frame.size.height = 1;
      webView.frame = frame;
      CGSize fittingSize = [webView sizeThatFits:CGSizeZero];
      frame.size = fittingSize;
      webView.frame = frame;

      NSLog(@"size: %f, %f", fittingSize.width, fittingSize.height);

      yourScrollView.contentSize = webView.bounds.size; 
}

The same thing can also be achieved using javascript to find the right height which is as follow:

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    CGRect oldBounds = [[self webView] bounds];
    CGFloat height = [[webView stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue];
    NSLog(@"NEW HEIGHT %f", height);
    [webView setBounds:CGRectMake(oldBounds.origin.x, oldBounds.origin.y, oldBounds.size.width, height)];
    yourScrollView.contentSize = webView.bounds.size;
}

Hope it helps!

Upvotes: 9

shawnwall
shawnwall

Reputation: 4607

I actually had the same problem recently and ended up figuring it out and putting together a sample project on github.

Upvotes: 5

nithinbhaktha
nithinbhaktha

Reputation: 723

You can set a constant height constraint on your WebView and change that dynamically once you calculate the height from the response.

Also constraint between a child view and a parent view can be achieved by this method in NSLayoutConstraint

+ (id)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c

Upvotes: 0

Related Questions