iOS 2017 UIWebView 实用举例
随着H5的大火,手机端的页面很多也被网页端侵蚀了,作为手机端的开发人员,就算不需要学会H5的开发,如何和h5(js)交互也成为了必要的技能,其中UIWebView的使用则是最最最基本的了,本文将从最基本处开始,直到与之交互,再收录些许扩展,记录一下这些知识以备后用。
1.代理方法
#pragma mark - webview代理方法
- (void)webViewDidStartLoad:(UIWebView *)webView
网页开始加载,基本上不怎么用到,网页加载过程中的一些事情可以在此时做;
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
这是与网页交互的桥梁,如果想要与网页互动,和H5协商好,不管是拼接URL,还是调用js,还是怎样,在此方法都可实现;
- (void)webViewDidFinishLoad:(UIWebView *)webView
页面加载完成的操作,比如显示网页的标题等等
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
网页加载失败的方法,可以设置一个失败的页面,最好不要白的,提高用户体验。
这四个方法是一定会用到的。
2.初始化方法
我们经常是需要给webview添加进度条和下拉刷新控件,
一般情况下,用一些很好的第三方的就完全够用了,比如,进度条使用NJKWebViewProgress实现,刷新嘛,当然是MJRefresh咯。
代码如下:
在.h添加 UIWebViewDelegate,UIScrollViewDelegate,NJKWebViewProgressDelegate
@property (nonatomic,strong) NJKWebViewProgress *webViewProgress;
@property (nonatomic,strong) NJKWebViewProgressView *webViewProgressView;
在.m页面初始化的时候实现
_webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight - 64 - 49)];
_webView.scrollView.mj_header =[MJRefreshNormalHeader headerWithRefreshingBlock:^{
[_webView reload];
}];
[_webView setBackgroundColor:[UIColor clearColor]];
[[_webView scrollView] setShowsVerticalScrollIndicator:NO];
[self.view addSubview:_webView];
[self setAutomaticallyAdjustsScrollViewInsets:NO];
_webViewProgress = [[NJKWebViewProgress alloc] init];
_webView.delegate = _webViewProgress;
_webView.scrollView.delegate= self;
_webViewProgress.webViewProxyDelegate = self;
_webViewProgress.progressDelegate = self;
CGRect navBounds = self.navigationController.navigationBar.bounds;
CGRect barFrame = CGRectMake(0, navBounds.size.height - 2, navBounds.size.width, 2);
_webViewProgressView = [[NJKWebViewProgressView alloc] initWithFrame:barFrame];
_webViewProgressView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
_webViewProgressView.backgroundColor = self.navigationController.navigationBar.backgroundColor;
[_webViewProgressView setProgress:0 animated:YES];
[self.navigationController.navigationBar addSubview:_webViewProgressView];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[_webView loadRequest:request];
#pragma mark - NJKWebViewProgressDelegate
-(void)webViewProgress:(NJKWebViewProgress *)webViewProgress updateProgress:(float)progress
{
[_webViewProgressView setProgress:progress animated:YES];
}
当然,如果页面加载完要设置标题的话:
if (webView.isLoading) {
return;
} else {
[_webView.scrollView.mj_header endRefreshing];
_webviewTitle = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
[self.navigationItem setTitle:_webviewTitle];
}
页面消失的时候需要:
[_webView stopLoading];
[_webViewProgressView setProgress:0 animated:YES];
这些基本的其实都可以一成不变了
3.webview失败页面处理
既然是网页的加载,必然出现失败的情况,失败的处理也非常重要,但是很简单,只需实现
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
//如果上一个请求还没完,又新建了个请求会报错
if(error.code == NSURLErrorCancelled )
{
return;
}
if (webView.request.URL.absoluteString && ![webView.request.URL.absoluteString isEqualToString:@""]) {
if (errorview) {
errorview.hidden = NO;
[webView addSubview:errorview];
}else{
errorview=[XFTools errorView:_webView.frame];
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(kScreenWidth/2-75, kScreenHeight-250, 150, 80);
[btn setTitle:@"重新加载" forState:UIControlStateNormal];
[btn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
[btn addTarget:self action:@selector(webviewLoadUrl) forControlEvents:UIControlEventTouchUpInside];
[errorview addSubview:btn];
[webView addSubview:errorview];
}
}
}
4.扩展(WKWebView)
如今,iOS系统已经升级到iOS10,使用iOS7及之前的系统的用户比例已经非常之小了,如果应用不需要支持他们,换言之就是从iOS8开始支持的话,不妨使用WKWebView,据说他有很多的优势,比如:60fps的滚动刷新率以及内置手势、将UIWebViewDelegate与UIWebView拆分成了14类与3个协议(查看官方文档 )、与Safari相同的JavaScript引擎、占内存更小等等。
用法:
别人的链接:点击此处
人家写的非常好,就不去抄了。。。。
=====本文告一段落=====