UIScrollView内的iOS UIWebView

我想在UIScrollView有一个UIWebView 。 UIWebView有时会超出iPhone屏幕的界限,所以我需要一种滚动视图的方式,以便我可以看到所有的内容(但我不想使用内置的UIWebView滚动)。 所以我正在考虑把所有的内容放入一个UIScrollView,然后让UIScrollView的高度等于UIWebView和其他视图的高度。

这是一个图像来帮助描述我的问题:

界面生成器图像

我做了完全一样的事情。 以下是我的工作原理:

  1. 添加UIWebView作为UIScrollView的子视图(显然;-)
  2. 禁用UIWebView的本地滚动(你可以通过遍历UIWebView的子视图来做到这一点,直到你find它的UIScrollView并设置scrollEnabled = NO。
  3. 将您的UIScrollView和UIWebView的框架的contentSize设置为UIWebViews HTML内容的大小。

最后一点有点棘手,因为当在UIWebViewDelegate上调用webViewDidFinishLoad时,无法确定HTML是否完全呈现。

以下是获取HTML内容大小的可靠方法:

1.将HTML函数添加到HTML文档准备好时调用的HTML函数中:

 window.onload = function() { window.location.href = "ready://" + document.body.offsetHeight; } 

这个函数发送一个请求,在URL中包含内容高度。

2.在你的UIWebViewDelegate中截取这个请求:

 - (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType { NSURL *url = [request URL]; if (navigationType == UIWebViewNavigationTypeOther) { if ([[url scheme] isEqualToString:@"ready"]) { float contentHeight = [[url host] floatValue]; yourScrollView.contentSize = CGSizeMake(yourScrollView.frame.size.width, contentHeight + yourWebView.frame.origin.y); CGRect fr = yourWebView.frame; fr.size = CGSizeMake(yourWebView.frame.size.width, contentHeight); yourWebView.frame = fr; return NO; } return YES; } 

希望有所帮助

UPDATE

这里是Swift 2版本:

 func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool { guard navigationType == .Other else { return true } if let url = request.URL, let host = url.host { guard url.scheme == "ready" else { return true } if let contentHeight = Float(host) { yourScrollView.contentSize = CGSizeMake(yourScrollView.bounds.size.width, CGFloat(contentHeight)) var fr = webView.frame fr.size = CGSizeMake(fr.size.width, CGFloat(contentHeight)) webView.frame = fr } return false } return true }