iOS7,iOS8,iOS9 UIWebView获取内容高度终极解决方案
来源:互联网 发布:淘宝仓库配货员招聘 编辑:程序博客网 时间:2024/06/14 21:30
场景
在 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]; }}
此处需要调整
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
if ([keyPath isEqualToString:@"contentSize"]) {
CGRect frame = _webView.frame;
frame.size = [[change objectForKey:NSKeyValueChangeNewKey] CGSizeValue];
_webView.frame = frame;
[self setTableViewHeaderFrame];
NSLog(@"%s %@",__func__,NSStringFromCGSize(frame.size));
}
}
在页面消失时记得 remove 监听对象,否则会闪退
-(void)viewWillDisappear:(BOOL)antimated{ [super viewWillDisappear:antimated]; [activityWebView.scrollView removeObserver:selfforKeyPath:@"contentSize" context:nil];
}
转自:http://my.oschina.net/joanfen/blog/464217?utm_source=tuicool&utm_medium=referral
- iOS7,iOS8,iOS9 UIWebView获取内容高度终极解决方案
- iOS7,iOS8,iOS9 UIWebView获取内容高度终极解决方案
- UIWebView 获取内容高度
- iOS7,iOS8和iOS9获取通讯录联系人
- iOS7,iOS8,iOS9适配
- 获取UIWebView的内容高度
- UIWebView如何获取内容高度
- UIWebView如何获取内容高度
- UIWebView如何获取内容高度
- iframe 根据内容自适应高度-终极解决方案
- 获取UIWebView的显示内容的高度
- 根据内容获取UIWebView的高度
- iOS UIWebView、WKWebView获取内容高度
- 获取UIWebView的内容高度(精准)
- iOS【终极方案】精准获取webView内容高度,自适应高度
- iOS【终极方案】精准获取webView内容高度,自适应高度
- iOS【终极方案】精准获取webView内容高度,自适应高度
- iOS【终极方案】精准获取webView内容高度,自适应高度
- 1j2ee即web项目,严格意义上来说,没有jsp代码,只有class文件、html文件、javascript文件。2 基于extjs框架的项目怎么怎么查看在浏览器中展示的最终html页面的代码 3
- 设计模式(三)观察者模式
- 4. vSphere5.1(或更高版本)上进行无共享存储的在线迁移
- javascript如何获取Php传过来的值
- Java文件操作(四)
- iOS7,iOS8,iOS9 UIWebView获取内容高度终极解决方案
- WWDC 2012 Session笔记——202, 228, 232 AutoLayout(自动布局)入门
- Uri的使用场景
- springmvc配置文件
- [个人博客搬运][Java]别写排序了,用TreeSet
- FineReport——获取控件值和单元格值
- Linux下安装和操作sql数据库
- Spinner
- Java为什么使用静态内部类?