- 在開(kāi)發(fā)app的過(guò)程中難免會(huì)遇到將
webView
加載到tableView
的cell上的需求钞脂,一般遇到這種問(wèn)題,通常想到的思路就是在webView
的回調(diào)方法webViewDidFinishLoad
中獲取到webView
的高度,刷新tableView
笙僚,將高度賦值給tableView
的回調(diào)方法heightForRow
芳肌。看似沒(méi)有任何問(wèn)題肋层,但是在實(shí)際操作的時(shí)候卻發(fā)現(xiàn)得到的高度并不是webView
的實(shí)際高度亿笤,顯然這種方法是行不通的。其實(shí)并不是方法不行栋猖,而是webViewDidFinishLoad
代理方法被調(diào)用時(shí)净薛,頁(yè)面并不一定完全展現(xiàn)完成,可能有圖片還未加載出來(lái)蒲拉,導(dǎo)致此時(shí)獲取的高度是并不是最終高度肃拜,過(guò)會(huì)兒圖片加載出來(lái)后痴腌,瀏覽器會(huì)重新排版,而我們?cè)谶@之前給了一個(gè)錯(cuò)誤高度燃领,導(dǎo)致顯示異常士聪。既然這種方法行不通,那么到底如何才能準(zhǔn)確計(jì)算webView
的高度呢猛蔽?答案是監(jiān)聽(tīng)剥悟,具體的實(shí)現(xiàn)過(guò)程如下:
- 給
webView的scrollView
的contentSize
屬性添加監(jiān)聽(tīng),每當(dāng)內(nèi)容發(fā)生變化曼库,contentSize
一定會(huì)跟著變区岗,捕獲這個(gè)變動(dòng),在監(jiān)聽(tīng)方法中實(shí)現(xiàn)webViewDidFinishLoad
中的代碼毁枯,也就是獲取最新的內(nèi)容高度賦給webView
:
//添加監(jiān)聽(tīng)
[_WebView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:@"WejinWuLiuViewController"];
//監(jiān)聽(tīng)回調(diào)
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
if ([keyPath isEqualToString:@"contentSize"]) {
_webViewHeight = [_WebView.scrollView contentSize].height;
CGRect newFrame = _WebView.frame;
newFrame.size.height = _webViewHeight;
_WebView.frame = newFrame;
}
}