iOS WKWebView 检测何时到达底部

leo*_*lav 5 uiwebview ios swift wkwebview

我有一个从 UIViewView 到 WKWebView 的迁移问题,在使用 WKWebView 时检测到滚动视图到达底部。在 WKWebView 之前,我使用 UIScrollViewDelegate 检测用户是否通过滚动到 WebView 的结尾来查看所有内容。如果他这样做了,则启用了“确认”按钮。iPhone - 知道 UIScrollView 是否到达顶部或底部

现在使用 WKWebView 这不再起作用。我想原因是,当使用 WKWebView 并加载一个 html 字符串时,它会缩小视图以获得内容的完全可见性。所以我必须通过将它附加到 html 字符串来设置视口。这以与 UIWebView 相同的方式显示内容,提供 html 字符串,而不设置视口。

但是现在加载时的 UIScrollViewDelegate 总是告诉底部已经到达。我猜,WKWebView 加载 html,以完全可见的方式缩放它,scrollViewDelegate 识别出内容完全可见,之后视口进入并放大页面,因此需要垂直滚动来显示完整内容. 但此时,我的“确认”按钮已经启用。

代码片段

override func scrollViewDidScroll(_ scrollView: UIScrollView){
    let scrollViewHeight = scrollView.frame.size.height;
    let scrollContentSizeHeight = scrollView.contentSize.height;
    let scrollOffset = scrollView.contentOffset.y;
    if (scrollOffset + scrollViewHeight == scrollContentSizeHeight)
    {
        self.confirmButton.isEnabled = true; 
    }
}
Run Code Online (Sandbox Code Playgroud)

使用 WKWebView,scrollContentSizeHeight 在加载时始终与 scrollViewHeight 相同,但在 scrollViewDidScroll 委托函数调用多次(不滚动)后,scrollContentSizeHeight 大于实际大小的 scrollViewHeight。

Sat*_*esh 8

但是现在加载时的 UIScrollViewDelegate 总是告诉底部已经到达。

特定情况下的问题UIScrollView是在WKWebView完全加载之前调用了委托。

取一个私有实例变量来检查是否URL已完全加载。

var isURLLoaded = false
Run Code Online (Sandbox Code Playgroud)

确认WKWebView您的 viewController 的委托。

webView.scrollView.delegate = self
webView.navigationDelegate = self
Run Code Online (Sandbox Code Playgroud)

并覆盖这些委托方法:

func scrollViewDidScroll(_ scrollView: UIScrollView) {

    if isURLLoaded {
        if scrollView.contentOffset.y >= (scrollView.contentSize.height - scrollView.frame.size.height) {
            confirmButton.isEnabled = true
        } else if scrollView.contentOffset.y < scrollView.contentSize.height {
            confirmButton.isEnabled = false
        }
    }
}

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {

    isURLLoaded = true
}
Run Code Online (Sandbox Code Playgroud)