UIWebView的基本了解
什么是UIWebView
1.UIVebView是系統(tǒng)內(nèi)置的瀏覽器控件
2.系統(tǒng)自帶的safari瀏覽器就是用WebView實(shí)現(xiàn)的
**注意 : **
1. webView是有缺點(diǎn)的,會(huì)導(dǎo)致內(nèi)存泄露,而且這個(gè)問題是它系統(tǒng)本身的問題。
2. 現(xiàn)在的開發(fā)并不完全是原生的開發(fā),而更加傾向于原生+Html5的方式
3. webView是OC代碼和html代碼之間進(jìn)行交互的橋梁-
WebView能加載的資源
1.能加載遠(yuǎn)程的網(wǎng)絡(luò)資源
2.能加載絕大部分的常見文件(如: html\htm , pdf\doc\ppt\txt , MP4等等)
加載MP4文件的示例圖片:
示例圖片1
示例圖片2
- UIWebView的常見屬性的設(shè)置
//設(shè)置網(wǎng)頁自動(dòng)適應(yīng)(默認(rèn)是NO)
self.webView.scalesPageToFit = YES;
//設(shè)置檢測(cè)網(wǎng)頁中的格式類型,all表示檢測(cè)所有類型包括超鏈接、電話號(hào)碼、地址等
self.webView.dataDetectorTypes = UIDataDetectorTypeAll;
//UIWebView內(nèi)有一個(gè)UIScrollView控件,所以可以滾動(dòng),通過設(shè)置scrollView,可以設(shè)置UIWebView的大小和位置
self.webView.scrollView.contentInset = UIEdgeInsetsMake(50, 0, 0, 0);
-
UIWebView常用的加載網(wǎng)頁的方法
1.通過加載返回的網(wǎng)址的url創(chuàng)建的請(qǐng)求對(duì)象加載
- (void)loadRequest:(NSURLRequest *)request;
2.通過返回的html5的標(biāo)簽數(shù)據(jù)生成html5字符串,進(jìn)行加載
- (void)loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL;
示例代碼"
//1.確定url(加載網(wǎng)頁)
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
//(加載本地文件)
NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/視頻/高清視頻/課堂問答-上午.mp4"];
//2.創(chuàng)建請(qǐng)求對(duì)象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.加載網(wǎng)頁
[self.webView loadRequest:request];
-
UIWebView的相關(guān)代理方法
設(shè)置UIWebView的代理屬性
self.webView.delegate = self;
代理方法
1.即將加載某個(gè)網(wǎng)頁(請(qǐng)求) 返回值:YES 可以加載該請(qǐng)求 NO 不加載
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSLog(@"shouldStartLoadWithRequest--%@",request.URL.absoluteString);
NSString *string = request.URL.absoluteString;
if ([string containsString:@"dushu"]) {
return NO;
}
return YES;
}
2.開始加載網(wǎng)頁的時(shí)候調(diào)用
-(void)webViewDidStartLoad:(UIWebView *)webView
{
NSLog(@"webViewDidStartLoad");
}
3.當(dāng)加載失敗或者是錯(cuò)誤的時(shí)候調(diào)用
-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
NSLog(@"didFailLoadWithError");
}
4.加載完成
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
NSLog(@"webViewDidFinishLoad");
self.goback.enabled = self.webView.canGoBack;
self.goforward.enabled = self.webView.canGoForward;
}
-
UIWebView小案例
通過UIVebView模擬Safari的界面,并實(shí)現(xiàn)界面的前進(jìn),后退,刷新等功能- 實(shí)現(xiàn)界面的前進(jìn)
- (void)goForward;
- 實(shí)現(xiàn)界面的前進(jìn)
[self.webView goForward]; 前進(jìn)
- 實(shí)現(xiàn)界面的后退
- (void)goBack;
[self.webView goBack]; 回退
- 實(shí)現(xiàn)界面的刷新
- (void)reload;
[self.webView reload]; 刷新
- 實(shí)現(xiàn)界面停止加載
- (void)stopLoading;
[self.webView stopLoading]; 停止加載
- 設(shè)置前進(jìn),后退,刷新的邏輯顯示,
通過代理方法加載完成代理方法和屬性實(shí)現(xiàn)
當(dāng)網(wǎng)頁加載完成后,WebView自己就已經(jīng)知道了是否能后退/前進(jìn)
代理方法:
-(void)webViewDidFinishLoad:(UIWebView *)webView;
屬性:
//能后退
@property (nonatomic, readonly, getter=canGoBack) BOOL canGoBack;
//能前進(jìn)
@property (nonatomic, readonly, getter=canGoForward) BOOL canGoForward;
//能加載
@property (nonatomic, readonly, getter=isLoading) BOOL loading;
代碼示例:
//4.加載完成
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
self.goback.enabled = self.webView.canGoBack;
self.goforward.enabled = self.webView.canGoForward;
}
-
攔截webView中的某些請(qǐng)求(或禁止請(qǐng)求包含某些特殊字符串的請(qǐng)求)
通過代理方法實(shí)現(xiàn)
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
示例代碼 :
//1.即將加載某個(gè)網(wǎng)頁(請(qǐng)求) 返回值:YES 可以加載該請(qǐng)求 NO 不加載
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSLog(@"shouldStartLoadWithRequest--%@",request.URL.absoluteString);
//獲取請(qǐng)求中的url,并轉(zhuǎn)換成字符串
NSString *string = request.URL.absoluteString;
if ([string containsString:@"dushu"]) {
return NO;
}
return YES;
}
- 完整小案例
@interface ViewController ()<UIWebViewDelegate>
/***拖拽出storyboard中的看屬性***/
@property (weak, nonatomic) IBOutlet UIBarButtonItem *goback;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *goforward;
@property (weak, nonatomic) IBOutlet UIWebView *webView;
@end
/\
@implementation ViewController
/***實(shí)現(xiàn)點(diǎn)擊 后退,前進(jìn),刷新 的功能***/
-(IBAction)goBackBtn:(UIBarButtonItem *)sender {
[self.webView goBack];
}
-(IBAction)goforwardBtn:(UIBarButtonItem *)sender {
[self.webView goForward];
}
-(IBAction)loadBtn:(UIBarButtonItem *)sender {
[self.webView reload];
}
/\
/***設(shè)置要加載的網(wǎng)頁,并加載,設(shè)置網(wǎng)頁的自適應(yīng),設(shè)置代理***/
-(void)viewDidLoad {
[super viewDidLoad];
//url
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
//2.request
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[self.webView loadRequest:request];
//設(shè)置自適應(yīng)網(wǎng)頁
self.webView.scalesPageToFit = YES;
//設(shè)置代理
self.webView.delegate = self;
}
/\
/***UIWebView的代理方法***/
#pragma mark UIWebViewDelegate
//1.即將加載某個(gè)網(wǎng)頁(請(qǐng)求) 返回值:YES 可以加載該請(qǐng)求 NO 不加載
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSLog(@"shouldStartLoadWithRequest--%@",request.URL.absoluteString);
NSString *string = request.URL.absoluteString;
if ([string containsString:@"dushu"]) {
return NO;
}
return YES;
}
//2.開始加載網(wǎng)頁的時(shí)候調(diào)用
-(void)webViewDidStartLoad:(UIWebView *)webView
{
NSLog(@"webViewDidStartLoad");
}
//3.當(dāng)加載失敗或者是錯(cuò)誤的時(shí)候調(diào)用
-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
NSLog(@"didFailLoadWithError");
}
//4.加載完成
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
NSLog(@"webViewDidFinishLoad");
self.goback.enabled = self.webView.canGoBack;
self.goforward.enabled = self.webView.canGoForward;
}