前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UIWebView 浏览器控件一、初始化与三种加载方式二、常用属性和方法三、代理方法 UIWebViewDelegate四、其它案例:

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

作者头像
用户2141756
发布2018-05-18 11:13:48
1.4K0
发布2018-05-18 11:13:48
举报
文章被收录于专栏:滕先生的博客滕先生的博客

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

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

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

代码语言:javascript
复制
- (void)loadRequest:(NSURLRequest *)request;

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

代码语言:javascript
复制
UIWebView * view = [[UIWebView alloc]initWithFrame:self.view.frame];
[view loadRequest:[NSURLRequestrequestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]];
[self.view addSubview:view];

2.第二种:

代码语言:javascript
复制
- (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL;

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

3.第三种:

代码语言:javascript
复制
- (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)textEncodingName baseURL:(NSURL *)baseURL;

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

二、常用属性和方法

属性:

1.设置webView的代理

代码语言:javascript
复制
@property (nonatomic, assign) id <UIWebViewDelegate> delegate;

2.内置的scrollView

代码语言:javascript
复制
@property (nonatomic, readonly, retain) UIScrollView *scrollView;

3.获取URL请求

代码语言:javascript
复制
@property (nonatomic, readonly, retain) NSURLRequest *request;

4.获取能否返回上一级

代码语言:javascript
复制
@property (nonatomic, readonly, getter=canGoBack) BOOL canGoBack;

5.获取能否跳转下一级

代码语言:javascript
复制
@property (nonatomic, readonly, getter=canGoForward) BOOL canGoForward;

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

代码语言:javascript
复制
@property (nonatomic, readonly, getter=isLoading) BOOL loading;

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

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

代码语言:javascript
复制
@property (nonatomic) BOOL scalesPageToFit;

例如:webView.scalesPageToFit = YES;

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

代码语言:javascript
复制
@property (nonatomic) UIDataDetectorTypes dataDetectorTypes;

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

代码语言:javascript
复制
@property (nonatomic) BOOL allowsInlineMediaPlayback;

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

代码语言:javascript
复制
@property (nonatomic) BOOL mediaPlaybackRequiresUserAction;

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

代码语言:javascript
复制
@property (nonatomic) BOOL mediaPlaybackAllowsAirPlay;

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

代码语言:javascript
复制
@property (nonatomic) BOOL suppressesIncrementalRendering;

13.设置用户交互模式

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

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

代码语言:javascript
复制
@property (nonatomic) UIWebPaginationMode paginationMode;

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

15.设置每一页的长度

代码语言:javascript
复制
@property (nonatomic) CGFloat pageLength;

16.设置每一页的间距

代码语言:javascript
复制
@property (nonatomic) CGFloat gapBetweenPages;

17.获取分页数

代码语言:javascript
复制
@property (nonatomic, readonly) NSUInteger pageCount;

18.禁用页面滚动弹跳

代码语言:javascript
复制
webView.scrollView.bounces = NO;

方法:

1.重新加载数据

代码语言:javascript
复制
- (void)reload;

2.停止加载数据

代码语言:javascript
复制
- (void)stopLoading;

3.返回上一级

代码语言:javascript
复制
- (void)goBack;

4.跳转下一级

代码语言:javascript
复制
- (void)goForward;

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

代码语言:javascript
复制
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString*)script;

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

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

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

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

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

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

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

JS代码在OC中的排版

第一种做法:

代码语言:javascript
复制
NSMutableString *js = [NSMutableString string];
[js appendString:@"function login (username, pwd) {"];
[js appendString:@"     return 10;"];
[js appendString:@"         ]"];
[js appendString:@"     login();"];

第二种做法:

代码语言:javascript
复制
NSString *js = @"function login (username, pwd) {  "
"   return 10;"
"       }"
"   login();";

三、代理方法 UIWebViewDelegate

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

代码语言:javascript
复制
- (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.开始加载时调用的方法

代码语言:javascript
复制
- (void)webViewDidStartLoad:(UIWebView *)webView;

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

代码语言:javascript
复制
- (void)webViewDidFinishLoad:(UIWebView *)webView;

例子:

代码语言:javascript
复制
- (void)webViewDidFinishLoad:(UIWebView *)webView{
NSString *js = @"document.getElementsByTagName('footer')[0].remove();";
[webView stringByEvaluatingJavaScriptFromString:js];}

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

(1)按标签名删除

(2)按类删除

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

代码语言:javascript
复制
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;

四、其它案例:

  1. 在Safari中打开链接地址
代码语言:javascript
复制
- (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代码
代码语言:javascript
复制
.disable-callout{
    -webkit-touch-callout:none ;
}

或在webViewDidFinisheLoad中使用

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

或在webViewDidFinisheLoad中使用

代码语言:javascript
复制
[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
  • - -webkit-tap-highlight-color 覆盖当用户tap链接或clickable元素时默认产生的高亮颜色(灰色)。如
代码语言:javascript
复制
.no-highlight{
    -webkit-tap-highlight-color:rgba(0,0,0,0);
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.03.16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、初始化与三种加载方式
  • 二、常用属性和方法
    • 属性:
      • 方法:
      • 三、代理方法 UIWebViewDelegate
      • 四、其它案例:
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档