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。
但是现在加载时的 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)