iOS动态获取UIWebView高度

场景

在 App 中加载网页时,通常情况我们只需要直接初始化一个 WebView,然后去加载对应的 URL 即可,但若是有时候有些个设计是需要将 web 与原生的 UI 搭载在一起,一般情况下,webView 的 内容一页是肯定不够的,换句话说,webView 的高度是不定的,那如果原生的 UI是一个 ScrollView,高度也是不定的,那放在一起的话就会有两个 ScrollView 分别滚动,而这样的体验是很差的(尝试过的都懂)。

这里的实际场景是:将 webView 设置为 TableView 的 headerView,tableView 可滚动,WebView 不可滚动。

尝试

我们想要的结果是将 WebView 设置为不可滚动,与原生的 UI 融合在一起,那这种情况下,我们必须得到 WebView 的内容高度,让 WebView 的高度与它所需要加载的网页的内容高度一致,才能让 WebView 将内容完全显示。

开始我是在加载完成的回调中去获取 webView 的 contentSize的高度

C代码   收藏代码
  1. - (void)webViewDidFinishLoad:(UIWebView *)webView{  
  2.   webViewHeight=[webView.scrollView contentSize].height;  
  3.   CGRect newFrame = webView.frame;  
  4.   newFrame.size.height = webViewHeight;  
  5.   webView.frame = newFrame;  
  6.   mainTableView.sectionHeaderHeight = webViewHeight;  
  7.   [mainTableView setTableHeaderView:webView];  
  8. }  

 

用这样的方法得到高度很有可能不是web的真实高度,如果web中有很多 图片未加载完成 的话,获取的高度将小于真实高度,那在它加载完成后,内容将显示不全。

解决

最终我是监听了 webView的 contentSize,每当contentSize的值改变时就去更改webView 的frame。

C代码   收藏代码
  1. [activityWebView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];  

 然后在回调方法里改变webView的frame

C代码   收藏代码
  1. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context  
  2. {  
  3.   if ([keyPath isEqualToString:@"contentSize"]) {  
  4.     webViewHeight = [[activityWebView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue];  
  5.     CGRect newFrame    = activityWebView.frame;  
  6.     newFrame.size.height  = webViewHeight;  
  7.     activityWebView.frame = newFrame;  
  8.     [mainTableView setTableHeaderView:activityWebView];  
  9.   }  
  10. }  

 

在页面消失时记得 remove 监听对象,否则会闪退

 

C代码  收藏代码
  1. -(void)viewWillDisappear:(BOOL)antimated{  
  2.   [super viewWillDisappear:antimated];  
  3.   [activityWebView.scrollView removeObserver:self  
  4. forKeyPath:@"contentSize" context:nil];  
  5. }  



个人代码项目中的代码:
实现原理:就是坚挺webview的contentsize 
  1. [activityWebView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];  
#pragma mark- UIWebViewDelegage
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"contentSize"]) {
        //        webViewHeight =
        CGRect newFrame       = myWebView.frame;
        newFrame.size.height  = [[myWebView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue];;
        NSLog(@"DTAG observeValueForKeyPath webViewHeight = %f ",[[myWebView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue]);
        //         NSLog(@"DTAG2 newFrame = %@",newFrame);
        myWebView.frame = newFrame;
        newFrame.size.height = newFrame.size.height+15;
        headerView.frame = newFrame;
        [mytable setTableHeaderView:headerView];
        //        [mytable setContentOffset:CGPointMake(0,0) animated:YES];
    }
}


- (void)webViewDidFinishLoad:(UIWebView *)webView{
    CGRect newFrame = webView.frame;
    newFrame.size.height = [webView.scrollView contentSize].height;
    myWebView.frame = newFrame;
    newFrame.size.height = newFrame.size.height +15;
    headerView.frame = newFrame;
    //    NSLog(@"DTAG1 newFrame = %@",newFrame);
    [mytable setTableHeaderView:headerView];
    //    [mytable setContentOffset:CGPointMake(0,0) animated:YES];
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值