UIWebView加載本地HTML文件

一攀唯、 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;

  1. - (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];//加載
  1. - (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

    1. 以Creat groups在引入的文件夾為黃色的
    2. 我們可以在項(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í)目錄的,這些文件是會被編譯
    3. 因此Create groups的方式添加到工程中获雕,則不管加入項(xiàng)目的文件的目錄結(jié)構(gòu)如何,在APP中都可以通過mainBundlePath/filename這樣結(jié)構(gòu)來訪問文件
    4. Create groups 創(chuàng)建的文件是參與預(yù)編譯的(內(nèi)部文件可以直接通過import引用)
  • Creat folder reference

    1. 以Creat folder reference在引入的文件夾為藍(lán)色的
    2. 只是單純的創(chuàng)建了引用,文件夾內(nèi)部的原有文件層次架構(gòu)并不會改變,所以在使用的時(shí)候需要通過mainBundlePath/Path/filename這樣的路徑來訪問文件.
    3. 顯然這種添加方法更適合我們項(xiàng)目需求(由于html文件內(nèi)部有文件引用路徑孽江,Creat folder reference引入的文件不會破壞原有文件的層次結(jié)構(gòu))
    4. 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

本文主要參考文章.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末萨驶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子艇肴,更是在濱河造成了極大的恐慌腔呜,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件再悼,死亡現(xiàn)場離奇詭異核畴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)冲九,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門谤草,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人莺奸,你說我怎么就攤上這事丑孩。” “怎么了憾筏?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵嚎杨,是天一觀的道長。 經(jīng)常有香客問我氧腰,道長枫浙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任古拴,我火速辦了婚禮箩帚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘黄痪。我一直安慰自己紧帕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著是嗜,像睡著了一般愈案。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鹅搪,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天站绪,我揣著相機(jī)與錄音,去河邊找鬼丽柿。 笑死恢准,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的甫题。 我是一名探鬼主播馁筐,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼坠非!你這毒婦竟也來了敏沉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤炎码,失蹤者是張志新(化名)和其女友劉穎赦抖,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辅肾,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年轮锥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了矫钓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舍杜,死狀恐怖新娜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情既绩,我是刑警寧澤概龄,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站饲握,受9級特大地震影響私杜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜救欧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一衰粹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧笆怠,春花似錦铝耻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽频丘。三九已至,卻和暖如春泡态,著一層夾襖步出監(jiān)牢的瞬間搂漠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工兽赁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留状答,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓刀崖,卻偏偏與公主長得像惊科,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子亮钦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容