`
stephen830
  • 浏览: 3011646 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

iOS动态获取UIWebView高度

 
阅读更多

 

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];
}

 

 

 

分享到:
评论

相关推荐

    iOS WKWebView和UIWebView高度自适应

    总之,实现iOS应用中的WKWebView和UIWebView高度自适应主要依赖于JavaScript与原生代码的交互。UIWebView通过`webViewDidFinishLoad:`代理方法,而WKWebView则利用`WKUserContentController`和`...

    iOS WKWebView和UIWebView自适应高度

    总的来说,无论是UIWebView还是WKWebView,实现自适应高度的关键在于正确地执行JavaScript代码以获取内容高度,并在适当的时候更新视图的布局。在iOS应用中,合理地利用这些技术,可以让用户获得更加流畅和自然的...

    ios webView获取高度

    2. 页面动态更新:如果页面内容是动态加载的,例如通过Ajax,那么需要监听`UIWebView`的`scrollViewDidScroll:`方法,或者通过JS监控滚动事件,实时获取当前页面高度。 总结,`ios webView获取高度`涉及到UIWebView...

    ios-TableView Cell加载WebiView高度自适应.zip

    "ios-TableView Cell加载WebiView高度自适应.zip"提供的解决方案正是针对这个问题,它通过WKWebView与JavaScript的交互来实现Cell高度的动态自适应。 WKWebView是苹果推出的新一代Web视图控制器,取代了旧的...

    在iOS应用中使用UIWebView创建简单的网页浏览器界面

    6. **动态获取UIWebView高度**: - 要实现动态获取UIWebView的高度,可以监听`webViewDidFinishLoad:`方法,然后使用`webView.scrollView.contentSize.height`获取网页内容的高度。如果需要,可以调整UIWebView的...

    ios-计算WKWebview的实际高度.zip

    标题中的“ios-计算WKWebview的实际高度.zip”提供了一个解决方案,通过观察者模式来动态计算WKWebView的高度,以避免出现高度计算不准确的问题。 WKWebView的默认行为是其高度会自适应内容,但有时由于网络延迟、...

    ios-TableView嵌套webView自适应高度.zip

    在iOS应用中,UITableView与UIWebView结合使用时,一个关键的问题是如何自适应地调整单元格的高度以适应网页内容的高度。这是因为网页内容的加载是异步的,而UITableView需要在加载前知道单元格的高度以进行布局。这...

    iOS获取cell中webview的内容尺寸

    通过这种方式,我们可以在UITableView的cell中动态获取UIWebView的内容高度,并据此调整cell的高度。这在处理HTML内容时非常有用,特别是在内容长度不确定的情况下,可以确保表格的正确布局。只要将HTML字符串传递给...

    iOS开发基本API

    在处理屏幕和状态栏方面,笔记提供了获取状态栏高度、导航栏和工具栏高度的方法,隐藏或显示状态栏,以及当屏幕方向改变时如何进行检测和适配屏幕布局。 针对视图层面上的自定义,笔记中包含了设置按钮、自定义...

    iOS Webview自适应实际内容高度的4种方法详解

    在iOS开发中,UIWebView是用于展示网页内容的重要组件。然而,当网页内容的高度超过UIWebView的初始设置时,需要让UIWebView自适应实际内容的高度,以确保用户能够完整浏览网页。本文将详细介绍四种实现这一功能的...

    WebKit和Chromium源码及原理剖析.pdf

    #### 第14篇 利用javascript和canvas获取UIWebView网页里的图片(不用再下载) - **技术原理**: - 本文介绍了如何使用JavaScript和Canvas API来直接从UIWebView中提取图片数据,而无需再次下载。 - 通过遍历DOM...

    IOS应用源码之CMHTMLView for iOS.rar

    与原生的WKWebView或UIWebView相比,CMHTMLView在性能和内存管理上有其独特的优势,尤其是在处理复杂的网页结构和大量动态内容时。 1. **自定义渲染** CMHTMLView的一大亮点在于它的自定义渲染能力。开发者可以...

    iOS中精确计算WebView高度的方法示例

    iOS中精确计算WebView高度的方法示例 iOS开发中,处理WebView的高度...我们学习了使用监听的方法来获取WebView的最新高度,并使用UIWebView的Delegate方法和添加HTML的标签语言来解决WebView自适应内容高度的问题。

    IOS开发 可以显示歌词的音乐播放器

    如果使用UILabel,可能需要自定义以支持动态高度调整和滚动。如果歌词文件是LRC格式,那么需要解析这些文件,将时间戳和对应的歌词行对应起来。解析过程涉及字符串处理和正则表达式。 3. **数据同步**:歌词与音乐...

    个人整理超精密的iOS笔记.pdf

    - **获取 IOS 设备的基本信息**: 通过 `UIDevice.current` 可以获取设备的信息,如型号、系统版本等。 - **用 NSDateFormatter 调整时间格式的代码**: 使用 `NSDateFormatter` 来格式化日期和时间。 - **UIView 设置...

    ios-tableView嵌套webView.zip

    3. **UIWebView的使用**:在tableView的代理方法`tableView(_:didSelectRowAt:)`中,当用户点击某行时,获取对应的新闻详情URL,并在对应的cell的webView中加载这个URL。使用`webView.load(URLRequest(url: URL))`...

    ios-咸鱼首页最新和附近效果.zip

    - **瀑布流布局**:"最新"模块可能采用了瀑布流布局,这种布局可以动态调整单元格的高度,使界面看起来更生动。 4. **地理位置服务**: - **CoreLocation**:实现"附近"功能需要集成Apple的CoreLocation框架,...

    移动互联网 iOS网络编程

    【移动互联网 iOS网络编程】是iOS应用开发中的一个重要领域,主要涉及如何使应用程序能够通过网络获取数据、与其他设备通信或提供网络服务。本篇将详细阐述iOS网络编程的基础知识、主流案例及其背后的理论。 首先,...

    swift-加载在cell上的webview自适应高度

    在这个回调中,我们可以获取到WebView的实际内容高度。可以通过以下代码实现: ```swift func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { webView.evaluateJavaScript("document.body...

    iOS使用WebView生成长截图的第3种解决方案

    2. 在`webView(_:didFinish:)`方法中,利用WKWebView的`evaluateJavaScript(_:)`方法执行JavaScript代码,获取网页的总高度,以确定需要截图的区域。 3. 使用类似于方案一的方法修改WKWebView的frame大小为网页的...

Global site tag (gtag.js) - Google Analytics