获取UIWebView的内容高度(精准) - 遇到的坑

获取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];
}

参考博客:
代理方法参考博客
监听方法参考博客

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值