iOS - Swift中精準(zhǔn)計(jì)算WKWebView的ContentSize高度

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)
                                            }
                                        }
                                    })
                                }
                            })
                        }
                    }
                }
            }
      }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容