场景

在 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的真正高度的更多相关文章

  1. [Flex] 动态获取组件宽度和高度

    flex中我们有时并不想一开始就设置某个组件的宽度和高度,而想动态获取某个组件经填充后的width和height,但是会发现width和height均为0,这时我们可以注册一下两个事件之一来解决. i ...

  2. 获取UIWebView的内容高度

    本文转载至 http://i.cnblogs.com/EditPosts.aspx?opt=1   #pragma mark - UIWebview delegete - (void)webViewD ...

  3. JS动态获取浏览器宽度和高度

    $(window).resize(function() { var width = $(this).width(); var height = $(this).height(); });

  4. swift 动态获取label宽度或高度

    func getLabHeigh(labelStr:String,font:UIFont,width:CGFloat) -> CGFloat { let statusLabelText: NSS ...

  5. 微信小程序之动态获取元素宽高

    我以前一直以为微信小程序不能动态获取view元素的宽高.但是自从看到: wx.createSelectorQuery() 这个api接口,以前的某些问题就能得到解决了... 那么,这个api接口怎么用 ...

  6. Js动态获取iframe子页面的高度////////////////////////zzzz

    Js动态获取iframe子页面的高度   Js动态获取iframe子页面的高度总结 问题的缘由 产品有个评论列表引用的是个iframe,高度不固定于是引发这个总结. 方法1:父级页面获取子级页面的高度 ...

  7. UITableView自定义Cell中,纯代码编程动态获取高度

    在UITableView获取高度的代理方法中,经常需要根据实际的模型重新计算每个Cell的高度.直接的做法是在该代理方法中,直接根据模型来返回行高:另 [1]-(CGFloat)tableView:( ...

  8. Swift4 - 动态计算UITableView中tableHeaderView的高度 - 获取子控件高度和宽度

    核心 : /// 获取 子控件高度 func sizeHeaderToFit(view:UIView) { view.setNeedsLayout() view.layoutIfNeeded() le ...

  9. 从动态获取div高度的问题展开来看

    ps 可能篇幅比较长,请大家耐心看看 今天有人在群里问我 动态获取高度怎么获取  我就说jq中的outerHeight. height .innerHeight   原生的height clientH ...

随机推荐

  1. winform —— 界面

    winform 界面简单介绍 窗体事件:理解为委托变量,指向哪个函数,就执行哪个函数.窗体:显示窗体的过程是一个通过模板造对象的过程.先走构造函数,构造函数中的InitializeComponent( ...

  2. 给远程桌面发送“Ctrl+Alt+Delete”组合键

    首先: 在运行里,输入osk, 打开软键盘 然后,这时先按下本地键盘的Ctrl和Alt键,再点远程"软键盘"的"Del"键,成功发送"Ctrl+Alt ...

  3. Appium项目搭建 For windows

    1.appium又安装了最新版本,更新了,1.4.16.1,然后整理电脑的时候发现自动更新的时候不是在原来的地方进行覆盖,所以就重新安装了一遍,注意需要看下环境变量是否配置了(用户变量:C:\Appi ...

  4. PHP学习笔记十一【数组】

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/h ...

  5. HTML5 自定义属性 data-*介绍

    在HTML5之前HTML4我们也可以自定义属性通过setAttribute去设置或者直接写在HTML标签里面那么HTML5新增data-*(*可以替换成你喜欢的任意名字)属性有什么用呢? 更便的捷操作 ...

  6. 动态链接库的生成(dll)和 动态链接库隐式and显式调用

    一.构建动态链接库(dll.dll dll.lib dll.h) 说明: .dll 是在执行程序是调用  .lib 是在连接程序是调用  .h是在编译程序时调用 1.头文件(声明导入函数):_decl ...

  7. jquery 字符个数(数字字母长度记为1,中文记为2,超过长度自动截)

    <script type="text/javascript">  //返回val的字节长度  function getByteLen(val) {  var len = ...

  8. 使用phpExcel导入Excel进入Mysql数据库

    1.http://phpexcel.codeplex.com/下载phpExcel 2. <? require_once 'PHPExcel.php'; require_once 'PHPExc ...

  9. JQ----树杈型导航

    简单的做了一个树杈型的导航结构如下所示: 废话不多说,上代码: HTML: <div class="wrapper"> <div class="tabt ...

  10. 显示Title和隐藏Title的ListView

    一.主要步骤 ①.调用ListView的addHeaderView(),创建一个与Title一样高的View,这样ListView就不会刚开始被遮盖了 ②.调用ListView的setOnTouchE ...