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页面来适配其视口大小,从而达到整屏显示内容的效果,并且用户可以用捏合动作来放大或缩小页面来查看内容。
代码语言:javascript复制默认情况下UIWebView加载HTML页面后,会以页面的原始大小进行显示,亦即如果页面的大小超出UIWebView视口大小,UIWebView会出现滚动效果,而且用户只能通过滚动页面来查看不同区域的内容,不能使用手指的捏合手势来放大或缩小页面。
@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代码的桥梁
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString*)script;
代码语言:javascript复制返回值:执行完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某个函数的时候,我们可以拿到这个函数的返回值,代码如下 :
代码语言: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代码的桥梁
- (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;
四、其它案例:
- 在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中使用
代码语言:javascript复制[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];
-
- -webkit-user-select
控制用户是否可以选择页面元素内容。IOS中,在页面元素中进行长按操作,safari会弹出菜单,来允许进行选择行为。禁用此行为代码
.disable-select{
-webkit-user-select:none;
}
或在webViewDidFinisheLoad中使用
代码语言:javascript复制[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
-
- -webkit-tap-highlight-color
覆盖当用户tap链接或clickable元素时默认产生的高亮颜色(灰色)。如
.no-highlight{
-webkit-tap-highlight-color:rgba(0,0,0,0);
}