前言

	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,可以将其像其它控件一样应用到需要的位置。

  • 优点:简单,快速。

  • 缺点:内存消耗大,对于手机端的硬件支持不够好,例如:定位,捏合(传统互联网只有点击动作)。

  • 应用场景:

    1. 适合于内容版式变化比较大的应用。

      网易新闻,各种图文混排,甚至嵌入视频。

      菜谱,各种图片搭配,图文并茂。

      运动类的应用:羽毛球,后场高远球,来一段视频,图解说明,分解动作...。

    2. 有些公司,有网站,没有 iOS 应用,着急上架,可以先用 webView 快速包装一个。

      百度的一系列应用,去年年初才慢慢的转成 iOS 应用。

    3. 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的更多相关文章

  1. ios UIWebView截获html并修改便签内容(转载)

    ios UIWebView截获html并修改便签内容 博客分类: iphone开发iphone开发phoneGap uiwebviewstringByEvaluatingJavaScriptFromS ...

  2. IOS UIWebView截获html并修改便签内容,宽度自适应

    需求:混合应用UIWebView打开html后,UIWebView有左右滚动条,要去掉左右滚动效果:  方法:通过js截获UIWebView中的html,然后修改html标签内容:  实例代码:  服 ...

  3. ios UIWebView截获html并修改便签内容

    需求:混合应用UIWebView打开html后,UIWebView有左右滚动条,要去掉左右滚动效果: 方法:通过js截获UIWebView中的html,然后修改html标签内容: 实例代码: 服务器端 ...

  4. iOS UIWebView 获取内容实际高度,关闭滚动效果

    本文转载至 http://my.oschina.net/Khiyuan/blog/341535   iOS UIWebView 获取内容实际高度,关闭滚动效果 近期做东西,将 UIWebView 嵌套 ...

  5. iOS UIWebView获取403/404

    问题描述 与WindowsPhone不同,iOS UIWebView并不认为403/404这种情况下页面访问是失败的,这也情有可原,但有时候,我们需要对WebView所遇到的403/404进行处理. ...

  6. iOS UIWebView与JavaScript的交互 相关资料

    UIWebView自适应宽度 iOS UIWebView中javascript与Objective-C交互.获取摄像头 iOS中JavaScript和OC交互 iOS与js交互,获取webview完整 ...

  7. ios UIWebView自定义Alert风格的弹框

    之前开发过一个App,因为公司之前写好了网页版的内容和安卓版本的App,我进去后老板要求我ios直接用网页的内容,而不需要自己再搭建框架.我一听,偷笑了,这不就是一个UIWebView吗?简单! 但是 ...

  8. iOS --- UIWebView的加载本地数据的三种方式

    UIWebView是IOS内置的浏览器,可以浏览网页,打开文档  html/htm  pdf   docx  txt等格式的文件.  safari浏览器就是通过UIWebView做的. 服务器将MIM ...

  9. iOS UIWebView中javascript与Objective-C交互、获取摄像头

    UIWebView是iOS开发中常用的一个视图控件,多数情况下,它被用来显示HTML格式的内容. 支持的文档格式 除了HTML以外,UIWebView还支持iWork, Office等文档格式: Ex ...

随机推荐

  1. uniq DEMO

    测试数据: [weblogic@etp-mall-dev7][/tmp]$ cat msn.txt aaa bbb bbb ccc ccc ddd bbb eee aaa ccc bbb sss op ...

  2. mongo VUE 操作

    一  修改字段名称 db.rc_配置_付款限额_消费.update({ "生效标识" : 1, "$atomic" : "true" },{ ...

  3. Cookie机制(会话cookie和持久化cookie)在客户端保持HTTP状态信息的方案

    1. Cookie只有一个name和一个value,不同于map;购物车设计的时候需要cookie,获取购物车的cookie id,以便于将物品多次放入购物车: 2.cookie获取了其地址,并且可以 ...

  4. LA 3704 Cellular Automaton

    题意概述: 等价地,本题可以转化为下面的问题: 考虑$n \times n$的$0-1$矩阵$A$,在第$i$行上第$[-d+i, d+i]$(模$n$意义下)列对应的元素为$1$,其余为$0$.求$ ...

  5. 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 ...

  6. Intent传递对象——Serializable和Parcelable区别

    为什么要将对象序列化? 1.永久性保存对象,保存对象的字节序列到本地文件中: 2.用过序列化对象在网络中传递对象: 3.通过序列化对象在进程间传递对象. 1.实现Serializable接口 Seri ...

  7. ThreadLocal实现线程范围内共享

    线程范围内共享,即是对相同一段代码,在不同的模块调用时使用一份数据,而在另外一个线程中又使用另外一份数据. ThreadLocal使用set方法为一个新的线程增加一条记录,key是各自的线程,valu ...

  8. log4j---------学习总结(一)

    一.log4j框架 log4j可靠的,快速的,可扩展的(灵活的)日志框架 log4j具有高可配置性,可以通过外部配置文件来控制 log4j可以根据日志不同级别来过滤日志, log4j可以将日志记录直接 ...

  9. SQL 数据类型,增删改查语句

    数据类型: --类似于C#中的数据类型 Datetime   范围是:1753.1.1-- 9999.12.31 Smalldatetime      1900.1.1 --2079.6.6 操作: ...

  10. C#获取当前页面的url

    C#获取当前页面的url string a= Request.ApplicationPath; // / string b = Request.CurrentExecutionFilePath; // ...