为啥 UIWebView 不能正确滚动?

Posted

技术标签:

【中文标题】为啥 UIWebView 不能正确滚动?【英文标题】:Why does UIWebView not scroll correctly?为什么 UIWebView 不能正确滚动? 【发布时间】:2014-12-26 07:37:26 【问题描述】:

我有一个相当简单的场景,只有一个 UIWebView 从包中加载一个 html 文档。 webView 填充顶部布局指南下方的屏幕,并使用推荐的约束。它有两个奇怪的行为:

    它从内容向下滚动开始。您可以在下面的第一张图片中看到这一点。粉色是UIWebView的颜色,html本身是白色的。

    webView 的 UIScrollView 本身有些愚蠢,因为(再次:参见图片)内容一直滚动到底部,但滚动条不在 webView 的顶部;它位于内容的顶部。

内容很容易滚动到那个粉红色区域,当内容一直向上滚动时,滚动条位于 UIWebView 的底部。见第二张图片。

我意识到我可以通过编程方式设置 contentOffset,但它只在 webViewDidFinishLoad 函数中有效,然后它会导致可见的跳转,因为 webview 先绘制自己然后滚动,所以这不好。

这里是 html(空格截断):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Untitled Document</title>
<link href="help.css" rel="stylesheet" type="text/css" />
</head>

<body>
<h2>Frequently-asked questions</h2>
</body>
</html>

还有 CSS:

@charset "UTF-8";
body 
    font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
    font-size: 16px;

这里是 ViewController:

class HelpViewController: UIViewController, UIWebViewDelegate 

    @IBOutlet weak var webView: UIWebView!

    override func viewDidLoad() 
        super.viewDidLoad()
        let navController = self.navigationController
        navController?.navigationBarHidden = false
    

    override func viewWillAppear(animated: Bool) 
        loadURL();
    

    func loadURL() 
        let htmlName = "support";
        let url = NSBundle.mainBundle().URLForResource(htmlName, withExtension: "html")
        self.webView.delegate = self;
        if let goodURL = url 
            let request = NSURLRequest(URL: goodURL)
            self.webView.loadRequest(request)
        
    

似乎问题一定与 IB 中的某些东西有关,但我看不出是什么。有什么好主意吗?

提前致谢!

-戴夫

【问题讨论】:

这是webview的布局问题,请在Interface Builder中显示设置 你在滚动视图中有一个 webview 吗?如果是这样,你不需要那个,因为 webview 包含一个它自己的滚动视图,你最终会得到两个滚动视图,我认为在你的情况下不需要。 @JeanLuc:我在滚动视图中没有 webview。 【参考方案1】:

所以,在某种程度上,我想我已经想通了。我在这个场景中有一个导航栏。我将 webview 的顶部约束设置为 Top Layout Guide,这是有道理的,因为这是我希望实际 dang webview 顶部所在的位置。但是,出于某种原因,这对我来说似乎不是 kosher,因此我将其更改为绑定到 superview 的顶部(场景的主视图)。

这可行:我可以在半透明导航栏下看到粉红色,但 webview 的实际内容定位正确。

UIWebView 似乎希望调整到整个视图的大小,如果有导航栏,那么它会缩短自己的滚动视图以允许导航栏的大小,无论调整大小是否实际需要/合理.也许我的应用正在做的其他事情正在解决这个问题,但如果没有,我认为这对 UIWebView 来说不是好的行为。

-戴夫

【讨论】:

以上是关于为啥 UIWebView 不能正确滚动?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 UIWebView 不滚动?

如何将UIWeb视图控制器的内容共享到社交网站?

如何将 UIWeb 视图控制器的内容分享到社交网站?

为啥 SwiftUI 不能正确显示两个视图?

ITMS-90809:不推荐使用的 API 使用 (UIWeb) - Xcode

为啥 UIWebView 不能在 Safari 中打开我的链接?