UIWebView 浏览器控件一、初始化与三种加载方式二、常用属性和方法三、代理方法 UIWebViewDelegate四、其它案例:

WebView的优缺点: 优点:(1)跨平台(2)发布更新快(3)排版布局能力强 缺点:(1)性能差(2)数据通讯复杂(3)耗费流量 使用场景:(1)排版复杂的内容(2)需后台灵活控制的界面

一、初始化与三种加载方式

UIWebView继承于UIView,因此,其初始化方法和一般的view一样,通过alloc和init进行初始化,其加载数据的方式有三种: 1.第一种:

- (void)loadRequest:(NSURLRequest *)request;

这是加载网页最常用的一种方式,通过一个网页URL来进行加载,这个URL可以是远程的也可以是本地的,例如加载百度的主页

UIWebView * view = [[UIWebView alloc]initWithFrame:self.view.frame];
[view loadRequest:[NSURLRequestrequestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]];
[self.view addSubview:view];

2.第二种:

- (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL;

这个方法需要将html文件读取为字符串,其中baseURL是我们自己设置的一个路径,用于寻找html文件中引用的图片等素材。

3.第三种:

- (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)textEncodingName baseURL:(NSURL *)baseURL;

这个方式使用的比较少,但也更加自由,其中data是文件数据,MIMEType是文件类型,textEncodingName是编码类型,baseURL是素材资源路径。

二、常用属性和方法

属性:

1.设置webView的代理

@property (nonatomic, assign) id <UIWebViewDelegate> delegate;

2.内置的scrollView

@property (nonatomic, readonly, retain) UIScrollView *scrollView;

3.获取URL请求

@property (nonatomic, readonly, retain) NSURLRequest *request;

4.获取能否返回上一级

@property (nonatomic, readonly, getter=canGoBack) BOOL canGoBack;

5.获取能否跳转下一级

@property (nonatomic, readonly, getter=canGoForward) BOOL canGoForward;

6.获取是否正在加载数据

@property (nonatomic, readonly, getter=isLoading) BOOL loading;

7.设置是否缩放到适合屏幕大小 UIWebView可以缩放HTML页面来适配其视口大小,从而达到整屏显示内容的效果,并且用户可以用捏合动作来放大或缩小页面来查看内容。

默认情况下UIWebView加载HTML页面后,会以页面的原始大小进行显示,亦即如果页面的大小超出UIWebView视口大小,UIWebView会出现滚动效果,而且用户只能通过滚动页面来查看不同区域的内容,不能使用手指的捏合手势来放大或缩小页面。

@property (nonatomic) BOOL scalesPageToFit;

例如:webView.scalesPageToFit = YES;

8.设置某些数据变为链接形式,这个枚举可以设置如电话号,地址,邮箱等转化为链接

@property (nonatomic) UIDataDetectorTypes dataDetectorTypes;

9.设置是否使用内联播放器播放视频

@property (nonatomic) BOOL allowsInlineMediaPlayback;

10.设置视频是否自动播放

@property (nonatomic) BOOL mediaPlaybackRequiresUserAction;

11.设置音频播放是否支持ari play功能

@property (nonatomic) BOOL mediaPlaybackAllowsAirPlay;

12.设置是否将数据加载如内存后渲染界面

@property (nonatomic) BOOL suppressesIncrementalRendering;

13.设置用户交互模式

@property (nonatomic) BOOL keyboardDisplayRequiresUserAction;
下面这些属性是iOS7之后才有的,通过他们可以设置更加有趣的web体验

14.这个属性用来设置一种模式,当网页的大小超出view时,将网页以翻页的效果展示

@property (nonatomic) UIWebPaginationMode paginationMode;

UIWebPaginationMode 枚举: UIWebPaginationModeUnpaginated //不使用翻页效果 UIWebPaginationModeLeftToRight //将网页超出部分分页,从左向右进行翻页 UIWebPaginationModeTopToBottom //将网页超出部分分页,从上向下进行翻页 UIWebPaginationModeBottomToTop //将网页超出部分分页,从下向上进行翻页 UIWebPaginationModeRightToLeft //将网页超出部分分页,从右向左进行翻页

15.设置每一页的长度

@property (nonatomic) CGFloat pageLength;

16.设置每一页的间距

@property (nonatomic) CGFloat gapBetweenPages;

17.获取分页数

@property (nonatomic, readonly) NSUInteger pageCount;

18.禁用页面滚动弹跳

webView.scrollView.bounces = NO;

方法:

1.重新加载数据

- (void)reload;

2.停止加载数据

- (void)stopLoading;

3.返回上一级

- (void)goBack;

4.跳转下一级

- (void)goForward;

5.通过javaScript操作web数据,一般在webViewDidFinishLoad代理方法中,在OC中执行JS代码的桥梁

- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString*)script;

返回值:执行完JS获取返回的东西,举例如下: (1)JS在执行完一段代码之后会将最后一个变量值返回给我们,代码如下 :

NSString *js = @"var dog = {name : 'teddy', age : 20};dog.name; dog.age;";
NSString *result = [webView stringByEvaluatingJavaScriptFromString:js];
NSLog(@"%@",result);  // 结果 : 20 字符串类型

(2)当我们调完JS某个函数的时候,我们可以拿到这个函数的返回值,代码如下 :

NSString *js = @"function login (username, pwd) { return 10;} login();";
NSString *result = [webView stringByEvaluatingJavaScriptFromString:js];
NSLog(@"%@",result);  // 结果 : 10 函数的返回值

(3)如何获取网页的所有源代码, 实现代码如下 :

NSString *js = @"document.getElementsByTagName('html')[0].outerHTML";
NSString *result = [webView stringByEvaluatingJavaScriptFromString:js];
NSLog(@"%@",result);  // 输出结果为网页所有的源代码

补充 : document.body.innerHTML 意思是获取body内容的所有源代码

JS代码在OC中的排版

第一种做法:

NSMutableString *js = [NSMutableString string];
[js appendString:@"function login (username, pwd) {"];
[js appendString:@"     return 10;"];
[js appendString:@"         ]"];
[js appendString:@"     login();"];

第二种做法:

NSString *js = @"function login (username, pwd) {  "
"   return 10;"
"       }"
"   login();";

三、代理方法 UIWebViewDelegate

1.每当webView发送一个请求之前都会先调用这个方法,监听准备加载内容时调用,通过判断请求等参数来返回不同返回值判断是否加载该网页,是JS中执行OC代码的桥梁

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;

参数: (1)request:即将发送的请求 (2)UIWebViewNavigationType 枚举: UIWebViewNavigationTypeLinkClicked 用户触击了一个链接 UIWebViewNavigationTypeFormSubmitted 用户提交了一个表单 UIWebViewNavigationTypeBackForward 用户触击前进或返回按钮 UIWebViewNavigationTypeReload 用户触击重新加载的按钮 UIWebViewNavigationTypeFormResubmitted 用户重复提交表单 UIWebViewNavigationTypeOther 发生其它行为 返回值:Yes允许发送这个请求,No禁止发送这个请求

例子:查看该案例发送和代理拦截请求(稍后整理,比较重要) 拼接HTML网页方法显示在WebView上

2.开始加载时调用的方法

- (void)webViewDidStartLoad:(UIWebView *)webView;

3.网页加载完毕执行的方法,一般在里面执行JS代码(删除一些节点),相当于网页JS的window.onload属性

- (void)webViewDidFinishLoad:(UIWebView *)webView;

例子:

- (void)webViewDidFinishLoad:(UIWebView *)webView{
NSString *js = @"document.getElementsByTagName('footer')[0].remove();";
[webView stringByEvaluatingJavaScriptFromString:js];}

补充:用JS删除,浏览器的console中调试

(1)按标签名删除

(2)按类删除

4.加载失败时调用的方法

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;

四、其它案例:

  1. 在Safari中打开链接地址
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    if ( navigationType == UIWebViewNavigationTypeLinkClicked ) {
        [[UIApplication sharedApplication] openURL:[request URL]];
        return NO;
    }
    return YES;
}

2.让UIWebView更加接近native(原生)

某些情况下,我们既想要UIWebView加载web页面,又想使得所加载的页面的外观和操作行为更加接近native感觉。这时需要使用一些CSS样式来达到这些效果,这些CSS只适用于IOS中的Safari。

  • - -webkit-touch-callout 禁用长按触控对象弹出的菜单。IOS中,当你长按一个触控对象时,如链接,safari会弹出包含链接信息的菜单。禁用此行为CSS代码
.disable-callout{
    -webkit-touch-callout:none ;
}

或在webViewDidFinisheLoad中使用

[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];
  • - -webkit-user-select 控制用户是否可以选择页面元素内容。IOS中,在页面元素中进行长按操作,safari会弹出菜单,来允许进行选择行为。禁用此行为代码
.disable-select{
    -webkit-user-select:none;
}

或在webViewDidFinisheLoad中使用

[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
  • - -webkit-tap-highlight-color 覆盖当用户tap链接或clickable元素时默认产生的高亮颜色(灰色)。如
.no-highlight{
    -webkit-tap-highlight-color:rgba(0,0,0,0);
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏進无尽的文章

UI篇-自定义控件之基类UIControl

UIControl的主要角色是定义一套接口和基础实现,为iOS的人机交互制定了一系列的标准, 为了当确定的事件发生的时候(比如点击了按钮)准备好动作消息(Ac...

1422
来自专栏玄魂工作室

[翻译]整合鼠标、触摸 和触控笔事件的

Html5 Pointer Event Api 原文链接 https://mobiforge.com/design-development/html5-poin...

3436
来自专栏LinXunFeng的专栏

iOS - 实现UINavigation全屏滑动返回(二)

1523
来自专栏前端儿

前端神器之Sublime Text2/3简单明了使用总结

第一:也是最重要的,它占内存很小(就如同notepad++那般迅速打开,所以那款其实也不错~)。一般IDE比如WebStorm(它也是一款神器来着),Aptan...

1152
来自专栏贾鹏辉的技术专栏@CrazyCodeBoy

React Native iOS原生模块开发实战|教程|心得

尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://www.devio.org) 告诉大家一个好消息,为大家精心准备的React N...

5696
来自专栏IMWeb前端团队

react组件性能优化探索实践

React本身就非常关注性能,其提供的虚拟DOM搭配上Diff算法,实现对DOM操作最小粒度的改变也是非常的高效。然而其组件渲染机制,也决定了在对组件进行更新时...

2527
来自专栏iOSer成长记录

AlamofireImage 源码阅读

3326
来自专栏前端说吧

vue - 使用vue实现自定义多选与单选的答题功能

3602
来自专栏老马寒门IT

jQuery EasyUI 详解

easyui 为创建现代化,互动,JavaScript 应用程序,提供必要的功能。

4011
来自专栏游戏杂谈

Flex + XML的图片轮显

逻辑部分与JavaScript有些类似,在解析XML时,单独写了一个as类来处理,btn的外观使用了CSS进行控制,资源全部放在名为assets文件夹目录下,工...

711

扫码关注云+社区

领取腾讯云代金券