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

2018-05-18 11:13:48 浏览数 (1)

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);
}

0 人点赞