一攀唯、 WebView簡單介紹
- WebView是iOS中比較常用的一個(gè)控件,特別是現(xiàn)在app不好推廣,下載成本高的時(shí)代,和原生相比,它可以通過后臺控制,隨意更新客戶端UI等等.
- WebView 既可以顯示本地的html也可以顯示網(wǎng)絡(luò)html
webView加載數(shù)據(jù)的方式文檔給出了三種:
- (void)loadRequest:(NSURLRequest *)request;
- (void)loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL;
- (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)textEncodingName baseURL:(NSURL *)baseURL;
- - (void)loadRequest:(NSURLRequest )request;
- 可以加載本地資源,也可以加載網(wǎng)絡(luò)資源
加載網(wǎng)絡(luò)地址
NSURLRequest *request =[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]];
[self.view addSubview:webView];
[webView loadRequest:request];
加載本地HTML
NSString *path = [[NSBundle mainBundle] pathForResource:@"file" ofType:@"html"];
NSURL* url = [NSURL fileURLWithPath:path];//創(chuàng)建URL
NSURLRequest* request = [NSURLRequest requestWithURL:url];//創(chuàng)建NSURLRequest
[webView loadRequest:request];//加載
- - (void)loadHTMLString:(NSString )string baseURL:(nullable NSURL)baseURL;
- 一般用來加載本地HTML資源
- 如果通過Creat folder reference方式引入的文件,則需要通過路徑來獲取文件內(nèi)容,下面兩種方法是等效的
例:
NSString *path = [[NSBundle mainBundle] pathForResource:@"html/start" ofType:@"html"];
NSString *htmlString1 = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL];
NSString *urlStr = [NSString stringWithFormat:@"%@/html",[[NSBundle mainBundle] bundlePath]];
NSURL *url = [NSURL fileURLWithPath:urlStr isDirectory:YES];
[self.webView loadHTMLString:htmlString1 baseURL:url];
NSString *mainBundlePath = [[NSBundle mainBundle] bundlePath];
NSString *basePath = [NSString stringWithFormat:@"%@/html",mainBundlePath];
NSURL *baseUrl = [NSURL fileURLWithPath:basePath isDirectory:YES];
NSString *htmlPath = [NSString stringWithFormat:@"%@/start.html",basePath];
NSString *htmlString = [NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil];
[self.webView loadHTMLString:htmlString baseURL:baseUrl];
注意:baseURL因?yàn)閔tml中一些資源的尋找需要到上個(gè)目錄中尋找,因此要寫
- 如果通過Creat groups則可以通過文件名直接訪問文件
NSString *path = [[NSBundle mainBundle] pathForResource:@"file" ofType:@"html"];
不太了解Creat groups和Creat folder reference引入文件的同學(xué),下面詳細(xì)介紹區(qū)別.
- -(void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)textEncodingName baseURL:(NSURL )baseURL;
/**
* data: 所加載文件的數(shù)據(jù)
* MIMEType:文件類型
* textEncodingName: 編碼類型
* baseURL: 資源路徑
*/
webView的代理方法:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
- (void)webViewDidStartLoad:(UIWebView *)webView;
- (void)webViewDidFinishLoad:(UIWebView *)webView;
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;
oc的方法名稱就像句子一樣,清晰明了的表達(dá)了方法的作用,因此代理我就不在啰嗦了!
二雷客、加載本地HTML
首先引入html文件到你的項(xiàng)目
-
引入文件有兩種選擇,一般很少有人注意,分別是:Create groups和Create folder references如下圖:
Creat groups和Creat folder reference的區(qū)別:
-
Creat groups
- 以Creat groups在引入的文件夾為黃色的
- 我們可以在項(xiàng)目中右鍵手動(dòng)New Group 但是新添加的文件夾并不是真的存在于項(xiàng)目目錄中,我們可以Show in Finder來查看項(xiàng)目文件結(jié)構(gòu),發(fā)現(xiàn)文件目錄中并沒有新建的文件夾.
但是從外部引進(jìn)來的group并不會如此,它在項(xiàng)目目錄匯中是存在真實(shí)目錄的,這些文件是會被編譯 - 因此Create groups的方式添加到工程中获雕,則不管加入項(xiàng)目的文件的目錄結(jié)構(gòu)如何,在APP中都可以通過mainBundlePath/filename這樣結(jié)構(gòu)來訪問文件
- Create groups 創(chuàng)建的文件是參與預(yù)編譯的(內(nèi)部文件可以直接通過import引用)
-
Creat folder reference
- 以Creat folder reference在引入的文件夾為藍(lán)色的
- 只是單純的創(chuàng)建了引用,文件夾內(nèi)部的原有文件層次架構(gòu)并不會改變,所以在使用的時(shí)候需要通過mainBundlePath/Path/filename這樣的路徑來訪問文件.
- 顯然這種添加方法更適合我們項(xiàng)目需求(由于html文件內(nèi)部有文件引用路徑孽江,Creat folder reference引入的文件不會破壞原有文件的層次結(jié)構(gòu))
- Creat folder reference創(chuàng)建的文件是不參與預(yù)編譯的障般,無發(fā)通過import直接引入
總結(jié): Creat groups和Creat folder reference的區(qū)別
- 引入的文件夾顏色不一樣
- 文件層次結(jié)構(gòu)不一樣了
其它差異歡迎補(bǔ)充
Bundle介紹
- 既然提到了Bundle,那我們就順便介紹下Bundle,之前對Bundle理解是很有限的
- 大部分iOS開發(fā)同學(xué)都不少些如何代碼
[[NSBundle mainBundle] pathForResource:@"someFileName" ofType:@"yourFileExtension"];
[YourViewController initWithNibName:"YourViewController" bundle:nil];
- bundle的創(chuàng)建 如果是圖片資源的話可以直接把文件夾的后綴修改為bundle丰辣,這樣就就是一個(gè)靜態(tài)資源庫。如果里面包含了xib和sb的話就要通過xcode創(chuàng)建翼闽,因?yàn)樾枰薷囊恍゜undle的配置信息拾徙,比如xib轉(zhuǎn)換成nib
- bundle是靜態(tài)資源靜態(tài)庫,包含了程序使用的資源(圖片肄程,聲音锣吼,nib选浑,編譯好的代碼等)
- 一個(gè)應(yīng)用程序是一個(gè)bundle,這個(gè)bundle就是我們說的main bundle
通過一下方法可以獲取
[NSBundle mainBundle];
- 如果獲取其它bundle下的資源玄叠,需要指定bundle路徑來獲取
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"文件名字" ofType:@"bundle"];
NSBundle *resourceBundle = [NSBundle bundleWithPath:bundlePath];
- 有了bundle對象之后就可以訪問bundle內(nèi)部資源
NSString *resourcePath = [resourceBundle pathForResource:@"" ofType:@""];
UIImage *image = [UIImage imageWithContentsOfFile:resourcePath];
這里有個(gè)小tap需要主要下 就是加載圖片為什么用 imageWithContentsOfFile而不用imagName?
- 先說區(qū)別吧
- imagName加載的圖片是有緩存在內(nèi)存中的古徒,下次如果用到同名的圖片會直接拿緩存中的圖片,而不會按照指定的路徑去重新加載圖片
- imageWithContentsOfFile加載圖片不會有緩存读恃,每次都重新尋址加載
bundle居多是用來存儲第三方庫的資源隧膘,這樣做是為了防止引入的庫內(nèi)的資源名字與項(xiàng)目名字沖突,這樣可以很好的防止資源名字重復(fù)問題寺惫,但是如果你用了imagName加載圖片疹吃,圖片可能就會無法區(qū)分。
- 加載HTML
- 首先我們看一下項(xiàng)目的文件層次,如圖:
整體結(jié)構(gòu) | HTML結(jié)構(gòu) |
---|---|
- 加載本文右側(cè)html的策略是通過下面這個(gè)方法來加載
- (void)loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL
NSString *mainBundlePath = [[NSBundle mainBundle] bundlePath];//文件根路徑
NSString *basePath = [NSString stringWithFormat:@"%@/html",mainBundlePath];//獲取目標(biāo)html文件夾路徑
NSURL *baseUrl = [NSURL fileURLWithPath:basePath isDirectory:YES];//轉(zhuǎn)換成url
NSString *htmlPath = [NSString stringWithFormat:@"%@/start.html",basePath];//目標(biāo) 文件路徑
NSString *htmlString = [NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil];//把html文件轉(zhuǎn)換成string類型
[self.webView loadHTMLString:htmlString baseURL:baseUrl];//加載
三西雀、加載本地HTML文件內(nèi)容適配問題
- 有時(shí)候我們app中嵌套webView,但是內(nèi)容有可能過大,或者過小,這時(shí)候就需要我們調(diào)整內(nèi)容大小.
- webView自帶有個(gè)屬性可以供我們使用,但是往往不能夠滿足需求
self.webView.scalesPageToFit = YES;
因此我們可以通過代理直接修改網(wǎng)頁的比例,可以在代理中通過下面方法來調(diào)整網(wǎng)頁的比例大小:
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
[webView stringByEvaluatingJavaScriptFromString:@"document.body.style.zoom=0.52"];
}
代碼地址:https://github.com/onegeng/Html-App
本文內(nèi)容多有不全,后續(xù)將會繼續(xù)補(bǔ)充添加,進(jìn)一步完善
歡迎大家的意見和指導(dǎo).如果有什么問題請留言或者給我發(fā)郵件onegeng@aliyun.com
本文主要參考文章.