1、什么是UIWebView
UIWebView是ios内置的浏览器控件,可以用来直接加载远程的网页资源,也可以加载绝大部分的常见文件htm/html、txt、pdf/keynote、ppt、doc/docx、音视频文件等等,还可以通过调用UIWebView提供的api实现页面的前进、后退、刷新等动作,甚至还可以动态的设置网页内容。
2.简单使用加载网页
/**
[UIScreen mainScreen].bounds.size.width 硬件屏幕的宽
[UIScreen mainScreen].bounds.size.height 硬件屏幕的高
**/
//1.创建一个UIWebView
UIWebView *web = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)];
//2.要打开的网址
NSString *openURL = @"https://www.baidu.com/";
NSURL *URL = [NSURL URLWithString:openURL];
NSURLRequest *requestURL = [NSURLRequest requestWithURL:URL];
//3。加载内容
[web loadRequest:requestURL];
[self.view addSubview:web];
模拟机运行效果图:
3.使用导航效果
浏览器一般都会有浏览导航按钮,我们在上一步的基础上加上一个返回按钮。
/**
UIWebView类内部会管理浏览器的导航动作,可以通过一下函数控制
[web goBack];//根据历史返回上一页
[web goForward];//根据历史前往下一页
[web reload];//重新加载
[web stopLoading];//停止加载
**/
//4.在导航栏添加一个按钮,这个按钮能返回上一页
UIBarButtonItem *goBack = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemReply target:self action:@selector(goBack)];
self.navigationItem.rightBarButtonItem = goBack;
-(void) goBack {
[web goBack];
}
运行效果图:
4.UIWebView加载本地文件
这里我举例加载一个音频文件,其他格式:png、jpg、gif、txt、docx、视频、html等文件也可如此。
/**
第一步:获取要加载的本地文件的路径
pathForResource:文件名
ofType:格式名
**/
NSString *path = [[NSBundle mainBundle] pathForResource:@"薛之谦-那是你离开了北京的生活" ofType:@"mp3"];
/**
第二步:根据文件路径获取url
**/
NSURL *url = [NSURL fileURLWithPath:path];
/**
第三步:根据路径加载文件为 NSData
**/
NSData *data = [NSData dataWithContentsOfFile:path];
/**
第四步:web 加载本地data
loadData:要加载的文件的data
MIMEType:文件的Type名
textEncodingName:编码格式一般为 @"UTF-8"
baseURL:要加载文件的url
**/
[web loadData:data MIMEType:[self mimeType:url] textEncodingName:@"UTF-8" baseURL:url];
/////根据 url 获取 MIMEType
- (NSString *)mimeType:(NSURL *)url {
//根据 url 得到 NSURLRequest(url请求)
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//初始化一个 NSURLResponse(url响应)
NSURLResponse *response = nil;
//根据 NSURLRequest 获得 NSURLResponse
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
//将 NSURLResponse 中的 MIMEType 返回
return response.MIMEType;
}
运行效果图:
5.UIWebView加载html文件
5.1.加载后台或网上下载的html字符串
/**
如果html文件从后台或网上下载的字符串
**/
NSString *html = @"";
NSURL *url = [NSURL URLWithString:html];
[web loadHTMLString:html baseURL:url];
5.2.加载本地html文件,可以用4.加载本地文件的方法,也可以用uiwebview专门加载html的方法。
//html的路径
NSString *htmlpath = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
NSString *html= [NSString stringWithContentsOfFile:htmlpath encoding:NSUTF8StringEncoding error:nil];
NSURL *url = [NSURL URLWithString:html];
//加载html
//baseURL:指导UIWebView对象如何跟随链接和加载远程资源
[web loadHTMLString:html baseURL:url];
运行效果图:
6. UIWebView的代理函数
/**
webView的最重要的代理函数,用来监听、拦截url的跳转或点击
**/
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
//获取每次跳转的url
NSString *url = [request.URL absoluteString];
//然后可以将监听的 url 和特定的网址进行对比:拦截动作
if ([url isEqualToString:@""]) {
//TODO YOU WANT TODO
return NO;//return NO 就不会继续跳转下去
}
return YES;//return YES 就会继续跳转下去
}
UIWebView使用注意事项(坑点)
-
释放UIWebView对象之前首先要将其delegate设置为nil,否则可能会出现异常crash等问题,一般在dealloc方法中处理;
-
UIWebView对象不应该被添加到UIScrollView对像的视图上,否则可能会出现无法预料的问题,因为系统无法正确处理两个视图的点击、滚动、手势操作等事件;
-
加载本地html文件时,确保使用loadHTMLString:baseURL:方法,不要使用loadRequest:方法;
-
UIWebView的stringByEvaluatingJavaScriptFromString:方法为同步执行,当前线程将等待该方法执行完成,因此调用该方法将会导致app出现挂起现象;