iOS - UIWebView
前言
NS_CLASS_AVAILABLE_IOS(2_0) __TVOS_PROHIBITED @interface UIWebView : UIView <NSCoding,
UIScrollViewDelegate>
@available(iOS 2.0, *) public class UIWebView : UIView, NSCoding, UIScrollViewDelegate
UIWebView 控件是做网络应用开发时使用的最多的一个控件,它实现了内置的浏览器(类似于 Safari),并且 UIWebView 继承自 UIView,可以将其像其它控件一样应用到需要的位置。
优点:简单,快速。
缺点:内存消耗大,对于手机端的硬件支持不够好,例如:定位,捏合(传统互联网只有点击动作)。
应用场景:
适合于内容版式变化比较大的应用。
网易新闻,各种图文混排,甚至嵌入视频。
菜谱,各种图片搭配,图文并茂。
运动类的应用:羽毛球,后场高远球,来一段视频,图解说明,分解动作...。有些公司,有网站,没有 iOS 应用,着急上架,可以先用 webView 快速包装一个。
百度的一系列应用,去年年初才慢慢的转成 iOS 应用。
iPhone 手机的浏览器 Safari 就是用 UIWebView 控件开发的。
微信内嵌的浏览器就是 UIWebView 控件
iOS 9+ 中若要加载 http: 网络,需要在 Info.plist 中添加 App Transport Security Settings -> key: Allow Arbitrary Loads,value: YES。
1、UIWebView 的创建
Objective-C
UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 20, self.view.bounds.size.width, self.view.bounds.size.height-20)]; // 将 webView 添加到屏幕
[self.view addSubview:webView]; // 加载网络地址
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]]; // 适配屏幕
webView.scalesPageToFit = YES;
Swift
let webView:UIWebView = UIWebView(frame: CGRectMake(0, 20, self.view.bounds.size.width, self.view.bounds.size.height-20)) // 将 webView 添加到屏幕
self.view.addSubview(webView) // 加载网络地址
webView.loadRequest(NSURLRequest(URL: NSURL(string: "http://www.baidu.com")!)) // 适配屏幕
webView.scalesPageToFit = true
2、UIWebView 的设置
Objective-C
// 加载指定 URL 所设定的内容
/*
异步加载,可以从服务器和本地读取
*/ // 加载网络数据
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]]; // 加载本地文件
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Baidu"
ofType:@"pdf"]]]]; // 加载 HTML 字符串数据
/*
指定 baseURL 可加载图片
*/ // 加载网络 HTML 字符串数据
NSString *htmlString1 = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"https://m.baidu.com/"]
encoding:NSUTF8StringEncoding
error:NULL];
[webView loadHTMLString:htmlString1 baseURL:[NSURL URLWithString:@"https://m.baidu.com/"]]; // 加载本地 HTML 字符串数据
NSString *htmlString2 = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Baidu" ofType:@"html"]
encoding:NSUTF8StringEncoding
error:NULL];
[webView loadHTMLString:htmlString2 baseURL:nil]; // 加载 Data 数据
/*
比 loadHTMLString 更底层
*/
NSData *data = [NSData dataWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Baidu" ofType:@"html"]]];
[webView loadData:data MIMEType:@"text/html" textEncodingName:@"utf-8" baseURL:[NSURL URLWithString:@"https://m.baidu.com/"]]; // 适配屏幕
/*
YES 页面可以通过放大和缩小去适应,用户也可以通过手势来放大和缩小
*/
webView.scalesPageToFit = YES; // 设置自动分页模式
/*
UIWebPaginationModeUnpaginated, // 默认不分页
UIWebPaginationModeLeftToRight,
UIWebPaginationModeTopToBottom,
UIWebPaginationModeBottomToTop,
UIWebPaginationModeRightToLeft
*/
webView.paginationMode = UIWebPaginationModeLeftToRight; // 设置超链接类型
/*
UIDataDetectorTypePhoneNumber = 1 << 0, // Phone number detection
UIDataDetectorTypeLink = 1 << 1, // URL detection
UIDataDetectorTypeAddress = 1 << 2, // Street address detection
UIDataDetectorTypeCalendarEvent = 1 << 3, // Event detection UIDataDetectorTypeNone = 0, // No detection at all
UIDataDetectorTypeAll = NSUIntegerMax // All types
*/
webView.dataDetectorTypes = UIDataDetectorTypeAll; // 设置是否用内嵌 HTML5 播放视频
/*
内嵌播放 HTML 中的 video 元素必须包含 webkit-playsinline 属性
YES 内嵌播放,NO 本地全屏控制,iPhone Safari defaults to NO. iPad Safari defaults to YES
*/
webView.allowsInlineMediaPlayback = NO; // 设置是否需要用户触发来启动媒体播放
/*
iPhone and iPad Safari both default to YES
*/
webView.mediaPlaybackRequiresUserAction = NO; // 设置本页面是否可以 AirPlay 播放
/*
iPhone and iPad Safari both default to YES
*/
webView.mediaPlaybackAllowsAirPlay = YES; // 设置是否把网页内容全部加载到内存中再去渲染
/*
iPhone and iPad Safari both default to NO
*/
webView.suppressesIncrementalRendering = NO; // 设置是否需要用户触发显示键盘
/*
default is YES
*/
webView.keyboardDisplayRequiresUserAction = NO; // 刷新
/*
重新加载页面
*/
[webView reload]; // 停止加载
/*
加载过程中,强行停止加载
*/
[webView stopLoading]; // 返回至上一个链接
/*
在产生多个链接浏览时,可以返回至浏览历史的上一个链接
*/
[webView goBack]; // 前进至下一个链接
/*
在产生多个链接浏览时,可以前进至浏览历史的下一个链接
*/
[webView goForward]; // 设置代理,需遵守协议 <UIWebViewDelegate>
webView.delegate = self;
Swift
// 加载指定 URL 所设定的内容
/*
异步加载,可以从服务器和本地读取
*/ // 加载网络数据
webView.loadRequest(NSURLRequest(URL: NSURL(string: "http://www.baidu.com")!)) // 加载本地文件
webView.loadRequest(NSURLRequest(URL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Baidu", ofType: "pdf")!))) // 加载 HTML 字符串数据
/*
指定 URL 可加载图片
*/ // 加载网络 HTML 字符串数据
let htmlString1:String = try! String(contentsOfURL: NSURL(string: "https://m.baidu.com/")!, encoding: NSUTF8StringEncoding)
webView.loadHTMLString(htmlString1, baseURL: NSURL(string: "https://m.baidu.com/")!) // 加载本地 HTML 字符串数据
let htmlString2:String = try! String(contentsOfFile: NSBundle.mainBundle().pathForResource("Baidu", ofType: "html")!,
encoding: NSUTF8StringEncoding)
webView.loadHTMLString(htmlString2, baseURL: nil) // 加载 Data 数据
/*
比 loadHTMLString 更底层
*/
let data = NSData(contentsOfURL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Baidu", ofType: "html")!))
webView.loadData(data!, MIMEType: "text/html", textEncodingName: "utf-8", baseURL: NSURL(string: "https://m.baidu.com/")!) // 适配屏幕
/*
true 页面可以通过放大和缩小去适应,用户也可以通过手势来放大和缩小
*/
webView.scalesPageToFit = true // 设置自动分页模式
/*
case Unpaginated // 默认不分页
case LeftToRight
case TopToBottom
case BottomToTop
case RightToLeft
*/
webView.paginationMode = .Unpaginated // 设置超链接类型
/*
PhoneNumber // Phone number detection
Link // URL detection
Address // Street address detection
CalendarEvent // Event detection None // No detection at all
All // All types
*/
webView.dataDetectorTypes = .All // 设置是否用内嵌 HTML5 播放视频
/*
内嵌播放 HTML 中的 video 元素必须包含 webkit-playsinline 属性
YES 内嵌播放,NO 本地全屏控制,iPhone Safari defaults to NO. iPad Safari defaults to YES
*/
webView.allowsInlineMediaPlayback = false // 设置是否需要用户触发来启动媒体播放
/*
iPhone and iPad Safari both default to YES
*/
webView.mediaPlaybackRequiresUserAction = false // 设置本页面是否可以 AirPlay 播放
/*
iPhone and iPad Safari both default to YES
*/
webView.mediaPlaybackAllowsAirPlay = true // 设置是否把网页内容全部加载到内存中再去渲染
/*
iPhone and iPad Safari both default to NO
*/
webView.suppressesIncrementalRendering = false // 设置是否需要用户触发显示键盘
/*
default is YES
*/
webView.keyboardDisplayRequiresUserAction = false // 刷新
/*
重新加载页面
*/
webView.reload() // 停止加载
/*
加载过程中,强行停止加载
*/
webView.stopLoading() // 返回至上一个链接
/*
在产生多个链接浏览时,可以返回至浏览历史的上一个链接
*/
webView.goBack() // 前进至下一个链接
/*
在产生多个链接浏览时,可以前进至浏览历史的下一个链接
*/
webView.goForward() // 设置代理,需遵守协议 UIWebViewDelegate
webView.delegate = self
3、UIWebView 的协议方法
需遵守协议 UIWebViewDelegate,并设置代理
Objective-C
// 将要开始加载网页
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { return YES;
} // 开始加载网页
- (void)webViewDidStartLoad:(UIWebView *)webView { } // 加载网页完成
- (void)webViewDidFinishLoad:(UIWebView *)webView { } // 加载网页失败
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { }
Swift
// 将要开始加载网页
func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool { return true
} // 开始加载网页
func webViewDidStartLoad(webView: UIWebView) { } // 加载网页完成
func webViewDidFinishLoad(webView: UIWebView) { } // 加载网页失败
func webView(webView: UIWebView, didFailLoadWithError error: NSError?) { }
iOS - UIWebView的更多相关文章
- ios UIWebView截获html并修改便签内容(转载)
ios UIWebView截获html并修改便签内容 博客分类: iphone开发iphone开发phoneGap uiwebviewstringByEvaluatingJavaScriptFromS ...
- IOS UIWebView截获html并修改便签内容,宽度自适应
需求:混合应用UIWebView打开html后,UIWebView有左右滚动条,要去掉左右滚动效果: 方法:通过js截获UIWebView中的html,然后修改html标签内容: 实例代码: 服 ...
- ios UIWebView截获html并修改便签内容
需求:混合应用UIWebView打开html后,UIWebView有左右滚动条,要去掉左右滚动效果: 方法:通过js截获UIWebView中的html,然后修改html标签内容: 实例代码: 服务器端 ...
- iOS UIWebView 获取内容实际高度,关闭滚动效果
本文转载至 http://my.oschina.net/Khiyuan/blog/341535 iOS UIWebView 获取内容实际高度,关闭滚动效果 近期做东西,将 UIWebView 嵌套 ...
- iOS UIWebView获取403/404
问题描述 与WindowsPhone不同,iOS UIWebView并不认为403/404这种情况下页面访问是失败的,这也情有可原,但有时候,我们需要对WebView所遇到的403/404进行处理. ...
- iOS UIWebView与JavaScript的交互 相关资料
UIWebView自适应宽度 iOS UIWebView中javascript与Objective-C交互.获取摄像头 iOS中JavaScript和OC交互 iOS与js交互,获取webview完整 ...
- ios UIWebView自定义Alert风格的弹框
之前开发过一个App,因为公司之前写好了网页版的内容和安卓版本的App,我进去后老板要求我ios直接用网页的内容,而不需要自己再搭建框架.我一听,偷笑了,这不就是一个UIWebView吗?简单! 但是 ...
- iOS --- UIWebView的加载本地数据的三种方式
UIWebView是IOS内置的浏览器,可以浏览网页,打开文档 html/htm pdf docx txt等格式的文件. safari浏览器就是通过UIWebView做的. 服务器将MIM ...
- iOS UIWebView中javascript与Objective-C交互、获取摄像头
UIWebView是iOS开发中常用的一个视图控件,多数情况下,它被用来显示HTML格式的内容. 支持的文档格式 除了HTML以外,UIWebView还支持iWork, Office等文档格式: Ex ...
随机推荐
- uniq DEMO
测试数据: [weblogic@etp-mall-dev7][/tmp]$ cat msn.txt aaa bbb bbb ccc ccc ddd bbb eee aaa ccc bbb sss op ...
- mongo VUE 操作
一 修改字段名称 db.rc_配置_付款限额_消费.update({ "生效标识" : 1, "$atomic" : "true" },{ ...
- Cookie机制(会话cookie和持久化cookie)在客户端保持HTTP状态信息的方案
1. Cookie只有一个name和一个value,不同于map;购物车设计的时候需要cookie,获取购物车的cookie id,以便于将物品多次放入购物车: 2.cookie获取了其地址,并且可以 ...
- LA 3704 Cellular Automaton
题意概述: 等价地,本题可以转化为下面的问题: 考虑$n \times n$的$0-1$矩阵$A$,在第$i$行上第$[-d+i, d+i]$(模$n$意义下)列对应的元素为$1$,其余为$0$.求$ ...
- 2016 Al-Baath University Training Camp Contest-1 D
Description X is well known artist, no one knows the secrete behind the beautiful paintings of X exc ...
- Intent传递对象——Serializable和Parcelable区别
为什么要将对象序列化? 1.永久性保存对象,保存对象的字节序列到本地文件中: 2.用过序列化对象在网络中传递对象: 3.通过序列化对象在进程间传递对象. 1.实现Serializable接口 Seri ...
- ThreadLocal实现线程范围内共享
线程范围内共享,即是对相同一段代码,在不同的模块调用时使用一份数据,而在另外一个线程中又使用另外一份数据. ThreadLocal使用set方法为一个新的线程增加一条记录,key是各自的线程,valu ...
- log4j---------学习总结(一)
一.log4j框架 log4j可靠的,快速的,可扩展的(灵活的)日志框架 log4j具有高可配置性,可以通过外部配置文件来控制 log4j可以根据日志不同级别来过滤日志, log4j可以将日志记录直接 ...
- SQL 数据类型,增删改查语句
数据类型: --类似于C#中的数据类型 Datetime 范围是:1753.1.1-- 9999.12.31 Smalldatetime 1900.1.1 --2079.6.6 操作: ...
- C#获取当前页面的url
C#获取当前页面的url string a= Request.ApplicationPath; // / string b = Request.CurrentExecutionFilePath; // ...