UIWebView 浏览器控件

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);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • http://www.cnblogs.com/mddblog/p/5281748.html 一、整体介绍 UIWe...
    F麦子阅读 1,150评论 0 2
  • 一、简介 近两年随着HTML5的迅速发展与日趋成熟,越来越多的移动开发者选择使用HTML5来进行混合开发,不仅节约...
    RainyGY阅读 1,811评论 1 12
  • 前言 关于UIWebView的介绍,相信看过上文的小伙伴们,已经大概清楚了吧,如果有问题,欢迎提问。 本文是本系列...
    CoderLF阅读 8,856评论 2 12
  • 一、简介 近两年随着HTML5的迅速发展与日趋成熟,越来越多的移动开发者选择使用HTML5来进行混合开发,不...
    宝宝teacher阅读 2,250评论 3 15
  • IOS之UIWebView的使用 刚接触IOS开发1年多,现在对于 混合式 移动端开发越来越流行,因为开发成本上、...
    学无止境666阅读 45,683评论 5 53