el.severo
el.severo

Reputation: 2277

get height of UIScrollView contentView

I have a UIViewController which has the following hierarchy (with their NSLayoutConstraints):

UIView
-UIScrollView
--UIView-ContentView (zero margins to the UIScrollview and equal height to UIScrollVIew's parent; mentioned in the code as self.contentView)
---UIView (fixed height, 0 top margin to Content View)
---UIView (fixed height, 0 top margin to above view)
---UIView (fixed height, 0 top margin to above view)
---UIView (fixed height, 0 top margin to above view)
---UIWebView (fixed height & linked to IBOutlet in the class; gets expanded)
---UILabel (top margin to UIWebView)
---UIView (fixed height, top margin to above label)
---UIView (fixed height, 0 top margin to above view)
---UIView (fixed height, 0 top margin to above view)
---UIView (fixed height, 0 top margin to above view)
---UIButton (fixed height, top margin to above view)

Scenario:
1. On viewDidLoad() I'm adding the HTML text by appending the JavaScript code that returns the height of the UIWebView
2. on UIWebViewDelegate method (shouldStartLoadWithRequest) I'm setting the following things:
- webViewHeight.constant (NSLayoutConstraint, linked from IB)
- self.scrollView.contentSize = CGSizeMake(self.view.frame.width, CGRectGetHeight(self.contentView.frame))


override func viewDidLoad() {
    self.webView.scrollView.scrollEnabled = false

    let heightHackScript = "<script type='text/javascript'>window.onload = function() { window.location.href = 'ready://' + document.body.offsetHeight; }</script>"

        if let cBody:NSData = self.model?.text_content {

          self.webView.loadHTMLString(heightHackScript + String(data: cBody, encoding: NSUTF8StringEncoding)!, baseURL: nil)
        }
  }


func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {

  let url = request.URL

  if navigationType == .Other {
    if url?.scheme == "ready" {
      webViewHeight.constant = (url?.host?.floatValue)!
      self.scrollView.contentSize = CGSizeMake(self.view.frame.width, CGRectGetHeight(self.contentView.frame))
      return false
    }
  }
  return true
}

The issue is that CGRectGetHeight(self.contentView.frame) doesn't gets the desired height. Any ideas?

So I'd like to get the height with constraints of the view after the HTML was loaded to UIWebView.

Upvotes: 1

Views: 484

Answers (1)

Scott Thompson
Scott Thompson

Reputation: 23701

The difficult problem when trying to resize a web view to fit it's content is the fact that the web view itself does not have any idea how tall the content of the DOM being displayed inside of it might be. What you have to do is ask the DOM how tall it's content is through JavaScript. In our code we do it something like this:

[webView stringByEvaluatingJavaScriptFromString: @"document.height"]

or in Swift:

webView.stringByEvaluatingJavaScriptFromString("document.height")

And use the resulting value to select a size for our UIWebView.

Upvotes: 1

Related Questions