IS移动开发总结

iOS 2017 UIWebView 实用举例

2017-05-09  本文已影响37人  brave_wu

       随着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引擎、占内存更小等等。

用法:

别人的链接:点击此处 

人家写的非常好,就不去抄了。。。。

=====本文告一段落=====


上一篇下一篇

猜你喜欢

热点阅读