在實際開發(fā)中,經(jīng)常碰見用富文本來展示內(nèi)容,但有時候并不是整個界面都是富文本,這就出現(xiàn)半原生半富文本。這時候就需要使用UITableView嵌套UIWebView,把UIWebView添加到cell里面來展示。唯一需要解決的問題就是監(jiān)控UIWebView的高度。下面講述兩種方法來監(jiān)控高度。
一、在webViewDidFinishLoad方法里進行監(jiān)控
CGFloat height = [[self.webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue];
self.webView1.frame = CGRectMake(self.webView1.frame.origin.x,self.webView1.frame.origin.y, SWidth, height+20);
[self.tableView reloadData];
這種方法有時候會出現(xiàn)計算偏差,導(dǎo)致你的網(wǎng)頁被砍掉了一部分,沒有顯示出來。原因是由于網(wǎng)頁有包含大量圖片,當(dāng)webView加載完成的時候,其實并沒有把圖片加載出來,也就是說調(diào)用webViewDidFinishLoad這個方法的時候,其實網(wǎng)頁里面圖片還沒有加載出來。導(dǎo)致圖片的高度并沒有計算出來。所以導(dǎo)致計算出現(xiàn)偏差。方法二就解決了這個問題。
二、通過KVO(鍵值監(jiān)聽機制)進行監(jiān)控高度
首先我們要注冊觀察者
[_webView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];
其次我們實現(xiàn)其代理方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
if ([keyPath isEqualToString:@"contentSize"]) {
CGSize fittingSize = [_webView sizeThatFits:CGSizeZero];
NSLog(@"webview %@",NSStringFromCGSize(fittingSize));
CGRect webFrame = _webView.frame;
webFrame.size.height = fittingSize.height;
_webView.frame = webFrame;
[self.webTableView reloadData];
}
}
最后記得移除觀察者
[self.webView removeObserver:self forKeyPath:@"contentSize"];
這樣就可以完美解決UIWebView高度問題。
希望能幫助到你。
Best regards
Roger