动态获取UIWebView高度

动态获取UIWebView高度

发表于5个月前(2015-06-08 16:47)   阅读( 325) | 评论(0) 4人收藏此文章, 我要收藏
0

阿里云携手开源中国众包平台发布百万悬赏项目 »  web

 

目录[-]markdown

场景

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

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

尝试

咱们想要的结果是将 WebView 设置为不可滚动,与原生的 UI 融合在一块儿,那这种状况下,咱们必须获得 WebView 的内容高度,让 WebView 的高度与它所须要加载的网页的内容高度一致,才能让 WebView 将内容彻底显示。阿里云

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

- (void)webViewDidFinishLoad:(UIWebView *)webView{ webViewHeight=[webView.scrollView contentSize].height; CGRect newFrame = webView.frame; newFrame.size.height = webViewHeight; webView.frame = newFrame; mainTableView.sectionHeaderHeight = webViewHeight; [mainTableView setTableHeaderView:webView]; } 

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

解决

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

[activityWebView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil]; 

而后在回调方法里改变webView的frame设计

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:@"contentSize"]) { webViewHeight = [[activityWebView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue]; CGRect newFrame = activityWebView.frame; newFrame.size.height = webViewHeight; activityWebView.frame = newFrame; [mainTableView setTableHeaderView:activityWebView]; } } 

在页面消失时记得 remove 监听对象,不然会闪退code

-(void)viewWillDisappear:(BOOL)antimated{ [super viewWillDisappear:antimated]; [activityWebView.scrollView removeObserver:self forKeyPath:@"contentSize" context:nil]; }
相关文章
相关标签/搜索