let web_contentSizeKeyPath = "contentSize"
webView.scrollView.addObserver(self, forKeyPath: web_contentSizeKeyPath, options: .new,context:nil)
需要注意:webview加載中雖然isLoading = false鏈接加載完成,但是頁(yè)面中的圖片、視頻等資源可能并未加載完成,此時(shí)的內(nèi)容高度是一直在變化的回調(diào)的block會(huì)多次觸發(fā),返回的高度并不是最終的內(nèi)容高度,最后一次返回的高度為精確的內(nèi)容高度
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == web_contentSizeKeyPath {
if self.infoWebView.estimatedProgress == 1.0 && self.infoWebView.isLoading == false {//判斷WebView加載完成
infoWebView.evaluateJavaScript("document.readyState") { [weak self] (readyState, readyStateError) in
guard let self = self else {return}
if let readyState = readyState as? String {
if readyState == "complete"{//加載完成了
self.infoWebView.evaluateJavaScript("document.body.scrollWidth",completionHandler: { [weak self](data, error ) in
guard let self = self else {return}
// let ratio = CGRectGetWidth(self.infoWebView.frame) / (data as? CGFloat ?? 0.0)
if let data = data as? CGFloat, data > 0 {
//計(jì)算縮放比
let ratio = infoWebView.frame.width / data
//offsetHeight:獲取對(duì)象相對(duì)于版面或由父坐標(biāo) offsetParent 屬性指定的父坐標(biāo)的高度
infoWebView.evaluateJavaScript("document.body.offsetHeight",completionHandler: { [weak self](data, error ) in
guard let self = self else {return}
//獲取的高度不準(zhǔn)確
//let height = self.infoWebView.scrollView.contentSize.height
var height:CGFloat = data as? CGFloat ?? 0.0
height = height * ratio
if self.webContentBgLayout_height.constant != height {
self.webContentBgLayout_height.constant = height
//高度回調(diào)
if self.webContentHeightBlock != nil {
self.webContentHeightBlock!(height)
print("#####高度:%@",height)
}
}
})
}
})
}
}
}
}
}
}