UIScrollView中的iOS UIWebView

时间:2011-06-22 13:13:22

标签: objective-c ios uiwebview uiscrollview

我想在UIWebView内加UIScrollView。 UIWebView有时会超出iPhone界限,所以我需要一种滚动视图的方法,这样我才能看到所有内容(但我不想使用UIWebView的内置滚动)。所以我正在考虑将所有内容放在UIScrollView中,然后使UIScrollView的高度等于UIWebView的高度和其中的其他视图。

这是帮助描述我的问题的图片:

Interface Builder Image

1 个答案:

答案 0 :(得分:38)

我做了同样的事情。以下是我的工作方式:

  1. 将UIWebView添加为UIScrollView的子视图(显然; - )
  2. 禁用UIWebView的本机滚动(您可以通过遍历UIWebView的子视图来执行此操作,直到找到它的UIScrollView并在其上设置scrollEnabled = NO。
  3. 将UIScrollView的contentSize和UIWebView的框架设置为UIWebViews HTML内容的大小。
  4. 最后一点有点棘手,因为在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;
    }
    

    希望有所帮助

    <强>更新

    这是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
    }