ios - 在 WKWebView 中获取静态页面的最终呈现高度
问题描述
在我的应用程序中,我使用的WKWebView
是加载带有静态内容的网页。
一旦contentSize
网页完全呈现在WKWebView
.
所以我想我可以使用webView:didFinishNavigation:
委托:
import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {
@IBOutlet weak var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
webView.navigationDelegate = self
webView.uiDelegate = self
webView.load(URLRequest(url: URL(string: "https://www.rockade.nl/testpage/testpage.php")!))
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
print("finished loading: height=\(webView.scrollView.contentSize.height)")
}
}
我对这段代码的问题是,在页面完全呈现之前调用了这个委托,所以我得到了不同的高度结果,甚至是 0 的值。
当我添加一个小的延迟时,我得到了正确的结果,但这感觉就像一个黑客。
使用这样的观察者
var myContext = 0
webView.scrollView.addObserver(self, forKeyPath: "contentSize", options: .new, context: &myContext)
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if context == &myContext {
print(webView.scrollView.contentSize.height)
} else {
super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
}
}
}
对我也没有帮助,因为我真的需要确保收到的值是最终高度。
很高兴知道:我无法控制网页,因此不能选择使用 javascript。
我希望有人能指出我正确的方向!
解决方案
因此,您无法控制网页,但 html dom 不会逐页更改。因此,您可以使用脚本来获取页面的高度。
也许这对您有帮助:
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
webView.evaluateJavaScript("document.readyState", completionHandler: { (complete, error) in
if complete != nil {
webView.evaluateJavaScript("document.body.scrollHeight", completionHandler: { (height, error) in
// Here is your height
})
}
})
}
PS:您也可以尝试“document.body.offsetHeight”而不是滚动高度。
推荐阅读
- python - 使用 python 从 url 列表中抓取网页
- javascript - 页面刷新后如何保存状态?
- c++ - Qt 防止 QDialog 隐藏
- google-apps-script - LockService:如何从脚本中锁定 Google 工作表?
- python - 从 bash 切换到 mac 终端上的 zsh shell 时,如何更新基本 python 版本?
- c - 这个宏如何检测对齐问题?
- hibernate - SpringBoot JPA 2.1 Converter 忽略 convertToDatabaseColumn
- php - jQuery AJAX 不会将变量数据发送到 PHP 脚本
- c - 将原始视频编码为 h264 无法播放
- kotlin - 在可空类型的接收器上只允许安全 (?.) 或非空断言 (!!.) 调用