Reputation: 2277
I have a UIViewController
which has the following hierarchy (with their NSLayoutConstraint
s):
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
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