动态获取UIWebView的真正高度
场景
在 App 中使用UIWebView加载网页, 与原生的 UI 显示在一起,一般情况下,webView 的 内容一页是肯定不够的,换句话说,webView 的高度是不定的,那如果原生的 UI是一个 ScrollView,高度也是不定的,那放在一起的话就会有两个 ScrollView 分别滚动,而这样的体验是很差的。所以需要计算 webView 的高度,设置ScrollView可滚动,WebView 不可滚动。
尝试
我们想要的结果是将 WebView 设置为不可滚动,与原生的 UI 融合在一起,那这种情况下,我们必须得到 WebView 的内容高度,让 WebView 的高度与它所需要加载的网页的内容高度一致,才能让 WebView 将内容完全显示。一开始我是在webView加载完成的回调中去获取 webView 的 contentSize的高度。
-(void)webViewDidFinishLoad:(UIWebView *)webView{
NSLog(@"加载完成的时候的方法调用");
//WebView的高度
NSString * htmlHeight = [self stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"];
float height = htmlHeight.floatValue;
NSLog(@"htmlHeight:%f",height);
CGRect rect = self.frame;
rect.size.height = height;
self.frame = rect;
}
用这样子的方法得到高度很有可能不是web的真实高度,如果web中有很多 图片未加载完成 的话,获取的高度将小于真实高度,那在它加载完成后,内容将显示不全。
解决
最终我是监听了 webView的 contentSize,每当contentSize的值改变时就去更改webView 的frame。
//监听webView的contentSize,每当contentSize的值改变时就去更改webView的frame
[self.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"]) {
float webViewHeight = [[self stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"] floatValue];
// NSLog(@"webViewHeight:%f",webViewHeight);
CGRect newFrame = self.frame;
float curHeight = self.frame.size.height;
newFrame.size.height = webViewHeight;
if(newFrame.size.height!=curHeight){
self.frame = newFrame;
if(self.questionDelegate&&[self.questionDelegate respondsToSelector:@selector(questionViewDidFinishLoad:)]){
[self.questionDelegate questionViewDidFinishLoad:self];
}
}
}
}
最后,记得在页面消失viewWillDisappear或自定义的WebView的方法removeFromSuperview中remove 监听对象,否则会出现crash异常,造成应用闪退。
-(void)removeFromSuperview{
@try{
[self.scrollView removeObserver:self forKeyPath:@"contentSize" context:nil];
}@catch(NSException * e){
NSLog(@"%@",e);
}
[super removeFromSuperview];
}
动态获取UIWebView的真正高度的更多相关文章
- [Flex] 动态获取组件宽度和高度
flex中我们有时并不想一开始就设置某个组件的宽度和高度,而想动态获取某个组件经填充后的width和height,但是会发现width和height均为0,这时我们可以注册一下两个事件之一来解决. i ...
- 获取UIWebView的内容高度
本文转载至 http://i.cnblogs.com/EditPosts.aspx?opt=1 #pragma mark - UIWebview delegete - (void)webViewD ...
- JS动态获取浏览器宽度和高度
$(window).resize(function() { var width = $(this).width(); var height = $(this).height(); });
- swift 动态获取label宽度或高度
func getLabHeigh(labelStr:String,font:UIFont,width:CGFloat) -> CGFloat { let statusLabelText: NSS ...
- 微信小程序之动态获取元素宽高
我以前一直以为微信小程序不能动态获取view元素的宽高.但是自从看到: wx.createSelectorQuery() 这个api接口,以前的某些问题就能得到解决了... 那么,这个api接口怎么用 ...
- Js动态获取iframe子页面的高度////////////////////////zzzz
Js动态获取iframe子页面的高度 Js动态获取iframe子页面的高度总结 问题的缘由 产品有个评论列表引用的是个iframe,高度不固定于是引发这个总结. 方法1:父级页面获取子级页面的高度 ...
- UITableView自定义Cell中,纯代码编程动态获取高度
在UITableView获取高度的代理方法中,经常需要根据实际的模型重新计算每个Cell的高度.直接的做法是在该代理方法中,直接根据模型来返回行高:另 [1]-(CGFloat)tableView:( ...
- Swift4 - 动态计算UITableView中tableHeaderView的高度 - 获取子控件高度和宽度
核心 : /// 获取 子控件高度 func sizeHeaderToFit(view:UIView) { view.setNeedsLayout() view.layoutIfNeeded() le ...
- 从动态获取div高度的问题展开来看
ps 可能篇幅比较长,请大家耐心看看 今天有人在群里问我 动态获取高度怎么获取 我就说jq中的outerHeight. height .innerHeight 原生的height clientH ...
随机推荐
- python中的tab补全功能添加
用Python时没有tab补全还是挺痛苦的,记录一下添加该功能的方法利人利己 1. 先准备一个tab.py的脚本 shell> cat tab.py #!/usr/bin/python # py ...
- AlertDialog详解
参考地址:http://blog.csdn.net/woaieillen/article/details/7378324 1.弹出提示框 new AlertDialog.Builder(LoginAc ...
- 第002篇 深入体验C#项目开发(一)
网上摘来的简介: <深入体验C#项目开发>通过10个综合实例的实现过程,详细讲解了C#在实践项目中的综合运用过程.这些项目从作者的学生时代写起,到项目经理结束,一直贯穿于作者 ...
- 读取webconfig里面的appSetting和connectionString
<appSettings> <add key="SiteURL" value="http://moss2007:7000" /> < ...
- 清理SQL数据库日志
Use DBSelect NAME,size From sys.database_files ALTER DATABASE DB SET RECOVERY SIMPLE WITH NO_WAIT AL ...
- c# 面相对象4-多态性
一.定义: 多态是面向对象程序设计的又一个特性.在面向过程的程序设计中,主要工作是编写一个个的过程或函数,这些过程和函数不能重名.例如在一个应用中,需要对数值型数据进行排序,还需要对字符型数据进行排序 ...
- Python和C#基本算法实现对比
最近在学习python,很多入门的例子又写了一遍,基本上是C#和Python都写了一遍,对比发现语言真是相通啊,只是语法不同而已. python开发也是用的VS,很好用,特别是代码段运行,选中一段py ...
- C# 中的常用正则表达式大全
这是从网上找来的,收藏一下备用,用到之处可以节省不少时间哦! 只能输入数字: "^[0-9]*$" . 只能输入n位的数字:"^\d{n}$". 只能输入 ...
- 学习asp.net比较完整的流程
如果你已经有较多的面向对象开发经验,跳过以下这两步: 第一步 掌握一门.NET面向对象语言,C#或VB.NET 我强烈反对在没系统学过一门面向对象(OO)语言的前提下去学ASP.NET. ASP.NE ...
- XML新手入门 创建构造良好的XML(1)
XML新手入门 创建构造良好的XML(1) 2009-03-19 09:24 Kay Whatley IBM Developerworks 我要评论(0) 字号:T | T 本文描述了构建良好的XML ...