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高度自适应主要依赖于JavaScript与原生代码的交互。UIWebView通过`webViewDidFinishLoad:`代理方法,而WKWebView则利用`WKUserContentController`和`...
总的来说,无论是UIWebView还是WKWebView,实现自适应高度的关键在于正确地执行JavaScript代码以获取内容高度,并在适当的时候更新视图的布局。在iOS应用中,合理地利用这些技术,可以让用户获得更加流畅和自然的...
2. 页面动态更新:如果页面内容是动态加载的,例如通过Ajax,那么需要监听`UIWebView`的`scrollViewDidScroll:`方法,或者通过JS监控滚动事件,实时获取当前页面高度。 总结,`ios webView获取高度`涉及到UIWebView...
"ios-TableView Cell加载WebiView高度自适应.zip"提供的解决方案正是针对这个问题,它通过WKWebView与JavaScript的交互来实现Cell高度的动态自适应。 WKWebView是苹果推出的新一代Web视图控制器,取代了旧的...
6. **动态获取UIWebView高度**: - 要实现动态获取UIWebView的高度,可以监听`webViewDidFinishLoad:`方法,然后使用`webView.scrollView.contentSize.height`获取网页内容的高度。如果需要,可以调整UIWebView的...
标题中的“ios-计算WKWebview的实际高度.zip”提供了一个解决方案,通过观察者模式来动态计算WKWebView的高度,以避免出现高度计算不准确的问题。 WKWebView的默认行为是其高度会自适应内容,但有时由于网络延迟、...
在iOS应用中,UITableView与UIWebView结合使用时,一个关键的问题是如何自适应地调整单元格的高度以适应网页内容的高度。这是因为网页内容的加载是异步的,而UITableView需要在加载前知道单元格的高度以进行布局。这...
通过这种方式,我们可以在UITableView的cell中动态获取UIWebView的内容高度,并据此调整cell的高度。这在处理HTML内容时非常有用,特别是在内容长度不确定的情况下,可以确保表格的正确布局。只要将HTML字符串传递给...
在处理屏幕和状态栏方面,笔记提供了获取状态栏高度、导航栏和工具栏高度的方法,隐藏或显示状态栏,以及当屏幕方向改变时如何进行检测和适配屏幕布局。 针对视图层面上的自定义,笔记中包含了设置按钮、自定义...
在iOS开发中,UIWebView是用于展示网页内容的重要组件。然而,当网页内容的高度超过UIWebView的初始设置时,需要让UIWebView自适应实际内容的高度,以确保用户能够完整浏览网页。本文将详细介绍四种实现这一功能的...
#### 第14篇 利用javascript和canvas获取UIWebView网页里的图片(不用再下载) - **技术原理**: - 本文介绍了如何使用JavaScript和Canvas API来直接从UIWebView中提取图片数据,而无需再次下载。 - 通过遍历DOM...
与原生的WKWebView或UIWebView相比,CMHTMLView在性能和内存管理上有其独特的优势,尤其是在处理复杂的网页结构和大量动态内容时。 1. **自定义渲染** CMHTMLView的一大亮点在于它的自定义渲染能力。开发者可以...
iOS中精确计算WebView高度的方法示例 iOS开发中,处理WebView的高度...我们学习了使用监听的方法来获取WebView的最新高度,并使用UIWebView的Delegate方法和添加HTML的标签语言来解决WebView自适应内容高度的问题。
如果使用UILabel,可能需要自定义以支持动态高度调整和滚动。如果歌词文件是LRC格式,那么需要解析这些文件,将时间戳和对应的歌词行对应起来。解析过程涉及字符串处理和正则表达式。 3. **数据同步**:歌词与音乐...
- **获取 IOS 设备的基本信息**: 通过 `UIDevice.current` 可以获取设备的信息,如型号、系统版本等。 - **用 NSDateFormatter 调整时间格式的代码**: 使用 `NSDateFormatter` 来格式化日期和时间。 - **UIView 设置...
3. **UIWebView的使用**:在tableView的代理方法`tableView(_:didSelectRowAt:)`中,当用户点击某行时,获取对应的新闻详情URL,并在对应的cell的webView中加载这个URL。使用`webView.load(URLRequest(url: URL))`...
- **瀑布流布局**:"最新"模块可能采用了瀑布流布局,这种布局可以动态调整单元格的高度,使界面看起来更生动。 4. **地理位置服务**: - **CoreLocation**:实现"附近"功能需要集成Apple的CoreLocation框架,...
【移动互联网 iOS网络编程】是iOS应用开发中的一个重要领域,主要涉及如何使应用程序能够通过网络获取数据、与其他设备通信或提供网络服务。本篇将详细阐述iOS网络编程的基础知识、主流案例及其背后的理论。 首先,...
在这个回调中,我们可以获取到WebView的实际内容高度。可以通过以下代码实现: ```swift func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { webView.evaluateJavaScript("document.body...
2. 在`webView(_:didFinish:)`方法中,利用WKWebView的`evaluateJavaScript(_:)`方法执行JavaScript代码,获取网页的总高度,以确定需要截图的区域。 3. 使用类似于方案一的方法修改WKWebView的frame大小为网页的...