获取UIWebView的内容高度(精准) - 遇到的坑
表头:OC布局头像,昵称,下划线,标题,UIWebView加载正文内容,webView下面OC布局的时间,查看数,和评论数
评论:是UITableView的cell
页面改了好几次,前面还有心情封装出去一个表头,后来烦的在controller直接布局……
关键就是获取UIWebView的高度
方法一:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
// 获取webView的高度
CGFloat webViewHeight = [[self.webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"] floatValue];
CGFloat webViewHeight = [[self.webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue];
CGFloat webViewHeight = [[self.webView stringByEvaluatingJavaScriptFromString:@"document.body.clientHeight"] floatValue];
// 更新表上控件的frame
// _webView,时间控件,查看数,评论数...的frame,整个表头的frame,再来一句
[self.tableView setTableHeaderView:_htmlHeaderV];
}
方法二:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
CGFloat webViewHeight = self.webView.scrollView.contentSize.height;
// 更新表上控件的frame
// _webView,时间控件,查看数,评论数...的frame,整个表头的frame,再来一句
[self.tableView setTableHeaderView:_htmlHeaderV];
}
方法三:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
CGSize actualSize = [webView sizeThatFits:CGSizeZero];
CGRect newFrame = webView.frame;
CGFloat webViewHeight = actualSize.height;
// 更新表上控件的frame
// _webView,时间控件,查看数,评论数...的frame,整个表头的frame,再来一句
[self.tableView setTableHeaderView:_htmlHeaderV];
}
方法四:
-(void)webViewDidFinishLoad:(UIWebView *)webView {
CGFloat webViewHeight = 0.0f;
if ([webView.subviews count] > 0) {
UIView *scrollerView = webView.subviews[0];
if ([scrollerView.subviews count] > 0) {
UIView *webDocView = scrollerView.subviews.lastObject;
if ([webDocView isKindOfClass:[NSClassFromString(@"UIWebDocumentView") class]]) {
webViewHeight = webDocView.frame.size.height;
// 更新表上控件的frame
// _webView,时间控件,查看数,评论数...的frame,整个表头的frame,再来一句
[self.tableView setTableHeaderView:_htmlHeaderV];
}
}
}
}
方法五:监听
// 添加监听
[self.webView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];
// 执行监听的方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"contentSize"]) {
CGFloat webViewHeight = [[self.webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue];
// 更新表上控件的frame
// _webView,时间控件,查看数,评论数...的frame,整个表头的frame,再来一句
[self.tableView setTableHeaderView:_htmlHeaderV];
}
}
// 移除监听
-(void)viewWillDisappear:(BOOL)antimated{
[super viewWillDisappear:antimated];
[activityWebView.scrollView removeObserver:self
forKeyPath:@"contentSize" context:nil];
}
方法六:代理
// 设置代理
_webView.delegate = self;
_webView.scrollView.delegate = self;
// 执行webView的代理
- (void)webViewDidFinishLoad:(UIWebView *)webView {
// 获取webView的高度
CGFloat webViewHeight = [[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"] floatValue];
// 记录高度,有时候计算的高度不准确,我的是偏小
_scrollViewH = webViewHeight;
// 更新表上控件的frame
// _webView,时间控件,查看数,评论数...的frame,整个表头的frame,再来一句
[self.tableView setTableHeaderView:_htmlHeaderV];
}
// 执行scrollView代理
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
// 获取webView的高度
CGFloat webViewHeight = [[self.webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"] floatValue];
// 我的webView代理计算出来的高度偏低,用这个方法,滚动一次,重新计算,布局
if (_scrollViewH < webViewHeight) {
_scrollViewH = webViewHeight;
} else {
return;
}
// 更新表上控件的frame
// _webView,时间控件,查看数,评论数...的frame,整个表头的frame,再来一句
[self.tableView setTableHeaderView:_htmlHeaderV];
}