【问题标题】:iOS UIWebView inside a UIScrollViewUIScrollView 内的 iOS UIWebView
【发布时间】:2011-09-20 09:24:53
【问题描述】:

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

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

【问题讨论】:

    标签: objective-c ios uiwebview uiscrollview


    【解决方案1】:

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

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

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

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

    1.在 HTML 文档准备好时调用的 HTML 中添加一个 javascript 函数:

    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
    }
    

    【讨论】:

    • 有人能把它翻译成swift吗?
    • @YestayMuratov 抱歉回复晚了。我在答案中添加了 Swift 2 版本
    • @joern 如果 HTML 内容有类似“显示更多”的链接并附有 JS(展开或加载和展开文章),这将不起作用,对吧?
    • @OgreSwamp 没错。它不适用于在用户交互后更改其高度的 HTML 内容。这篇博文描述了一种如何处理“显示更多”场景的方法:pixeldock.com/blog/… 该示例使用自动布局,但您也可以在不使用自动布局的情况下使用 KVO 部分。 TLDR;您观察UIScrollView 内的contentSize UIWebView 并在contentView 的高度发生变化时更改UIWebView 的高度。
    猜你喜欢
    • 2012-07-16
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多