iOS开发- 动态获取UIWebView高度
2015-10-07 15:17
417 查看
场景
在 App 中加载网页时,通常情况我们只需要直接初始化一个 WebView,然后去加载对应的 URL 即可,但若是有时候有些个设计是需要将 web 与原生的 UI 搭载在一起,一般情况下,webView 的 内容一页是肯定不够的,换句话说,webView 的高度是不定的,那如果原生的 UI是一个 ScrollView,高度也是不定的,那放在一起的话就会有两个 ScrollView 分别滚动,而这样的体验是很差的(尝试过的都懂)。这里的实际场景是: 将 webView 设置为 TableView 的 headerView,tableView 可滚动,WebView 不可滚动。
尝试
我们想要的结果是将 WebView 设置为不可滚动,与原生的 UI 融合在一起,那这种情况下,我们必须得到 WebView 的内容高度,让 WebView 的高度与它所需要加载的网页的内容高度一致,才能让 WebView 将内容完全显示。开始我是在加载完成的回调中去获取 webView 的 contentSize的高度
- (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中有很多 图片未加载完成 的话,获取的高度将小于真实高度,那在它加载完成后,内容将显示不全。
解决
最终我是监听了 webView的 contentSize,每当contentSize的值改变时就去更改webView 的frame。[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 监听对象,否则会闪退
-(void)viewWillDisappear:(BOOL)antimated{ [super viewWillDisappear:antimated]; [activityWebView.scrollView removeObserver:self forKeyPath:@"contentSize" context:nil]; }
相关文章推荐
- iOS开发- 处理空字符串
- 移动端 META
- android之读取xml文件中的数据和创建
- Swift中Singleton的实现
- unity3D 调用set和get方法
- autoresizesSubviews
- Android学习手记(1) Activity跳转
- mac 您需要安装旧 Java SE 6 运行环境才能打开Android Studio,Intellij IDEA
- 详解Android中AsyncTask的使用
- android 签名、混淆打包
- Android中AsyncTask用法
- Android布局动画---给你的View闪亮登场
- IOS开发——多线程
- Android实战技巧:深入解析AsyncTask
- android 下 利用webview实现浏览器功能
- Android:使用云服务Bomb服务简单案例
- iOS开发使用WebViewJavascriptBridge实现OC与JS交互
- Android实战技巧:多线程AsyncTask
- 如何把设计图自动转换为iOS代码? 在线等,挺急的!
- objective-c 谓词