iOS动态获取UIWebView高度
z转载自 http://my.oschina.net/joanfen/blog/464217
场景
在 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]; }
相关推荐
根据加载的html内容,自适应高度
根据加载的html内容,自适应高度
IOS自定义请求uiwebview的loading框 支持文字和转圈特效同时存在 动态显示 调用方便
ios的UIWebView详解,定义、实现delegate、webView和js的交互、原生调用js、js调用原生,三种方法实现获取webView的高度
IOS--UIWebView加载进度条(NJKWebViewProgress)
ITMS-90809: Deprecated API Usage - New apps that use UIWebView are no longer accepted. Instead, use WKWebView for improved security and reliability. Unity IOS审核被拒,解决办法,去网上看了好多帖子,...
NULL 博文链接:https://sheng.iteye.com/blog/1311872
iOS UIWebView URL拦截.pdf
ios的UIWebView详解,定义、实现delegate、webView和js的交互、原生调用js、js调用原生
ios-UIWebView简易浏览器
angular-ios9-uiwebview-patch Bower和NPM支持
将UIWebVIew和WKWebView封装到一起,当系统版本大于8.0时候选择WKWebView降低性能消耗,当小于8.0时候使用UIWebView进行加载 1、将项目中的根目录中的“ZLCWebView源文件”中的ZLCWebView.h及m拖入工程(或直接在...
完美的webView,不懂UIwebView的可以看看
详情请参考http://blog.csdn.net/hursing/article/details/12868109
iOS开发之UIWebView 是本文要介绍的内容,UIWebView是iOS sdk中一个最常用的控件。是内置的浏览器控件,我们可以用它来浏览网页、打开文档等等。这篇文章我将使用这个控件,做一个简易的浏览器。如下图: 我们创建...
主要为大家详细介绍了iOS之UIWebView无法获取web标题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
http://blog.csdn.net/totogo2010/article/details/7690034
iOS-UIWebview缓存并保证实时性 详细解释:http://blog.csdn.net/u014220518/article/details/72380291 欢迎关注!
UIWebView 是用来加载加载网页数据的一个框,接下来通过本文给大家介绍IOS中使用UIWebView 加载网页、文件、 html的方法,对本文详情感兴趣的朋友一起学习吧