開(kāi)發(fā)中辟犀,一些地方用到webView需要根據(jù)其內(nèi)容的多少來(lái)動(dòng)態(tài)的計(jì)算高度并且自適應(yīng)。但是往往獲取到的高度并不是那么的精準(zhǔn),以至于布局錯(cuò)亂。
我們以往的做法是:在webView的回調(diào)方法webViewDidFinishLoad中獲取網(wǎng)頁(yè)內(nèi)容高度嚣鄙,設(shè)置為webView的高度,調(diào)整webView布局串结。
實(shí)際上:webViewDidFinishLoad代理方法被調(diào)用時(shí)哑子,頁(yè)面并不一定完全展現(xiàn)完成舅列,可能有圖片還未加載出來(lái),導(dǎo)致此時(shí)獲取的高度是并不是最終高度卧蜓,過(guò)會(huì)兒圖片加載出來(lái)后帐要,瀏覽器會(huì)重新排版,而我們?cè)谶@之前給了一個(gè)錯(cuò)誤高度弥奸,導(dǎo)致顯示異常榨惠。
那么,如何能在webViewDidFinishLoad之后獲取到網(wǎng)頁(yè)內(nèi)容高度的變化盛霎?
答案在此:給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:
添加觀察者
[_webView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];
觀察結(jié)果處理
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
if ([keyPath isEqualToString:@"contentSize"]) {
CGSize webViewSize = [_webView sizeThatFits:CGSizeZero];
_webView.frame = CGRectMake(0, 0, webViewSize.width, webViewSize.height);
}
}