iOS中的UIWebView的混合編程

1:基于為何要使用UIWebView來開發(fā),頁(yè)面的都具有以下共同特點(diǎn)

a:排版復(fù)雜。通常包括圖片和文字的混排,還有可能有鏈接需要支持點(diǎn)擊。如果不用UIWebView,自己用原生控件通過拼接來實(shí)現(xiàn),由于界面元素太多,做起來會(huì)很困難,而如果用CoreText來實(shí)現(xiàn),就需要自己視線相當(dāng)多的復(fù)雜拍版邏輯 。

b:界面的變法需求頻繁,列如淘寶的彩票頁(yè)面,可能常常需要更新界面以推出不同的活動(dòng),采用UIWebView實(shí)現(xiàn)后,這類頁(yè)面就可以動(dòng)態(tài)的更新而不用向AppStore提交新的版本,而原生實(shí)現(xiàn)的界面很難達(dá)到如此的靈活性。

c:界面對(duì)用戶的交互需求不復(fù)雜,因?yàn)閁IWebView實(shí)現(xiàn)的交互效果與原生的效果相比還是會(huì)大打折扣,所以這類界面通暢都沒有復(fù)雜的交互效果,這也是主流應(yīng)用大多采用混合UIWebView來實(shí)現(xiàn)應(yīng)用界面而不是使用純UIWebView來實(shí)現(xiàn)界面的原因。

2:使用模版引擎來渲染HTML界面

在實(shí)際開發(fā)中,UIWebView控件接受一個(gè)HTML內(nèi)容,用于呈現(xiàn)相應(yīng)的界面,下面是API的接口:

- (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL;

由于HTML內(nèi)容通常是變法的,所以我們需要在內(nèi)存中生成該HTML內(nèi)容。比較簡(jiǎn)單粗暴的做法是將該HTML的幾本內(nèi)容定義在一個(gè)NSString中,然后用objc [NSString stringWithFormat]的方法將內(nèi)容進(jìn)行格式化,下面是一個(gè)實(shí)列:

-(NSString *)demoFormatWithName:(NSString *)name valur:(NSString *)value{
    
    NSString *html =
    @"<HTML>"
    "<HEAD>"
    "</HEAD>"
    "<BODY>"
    "<H1>%@</H1>"
    "<P>%@</P>"
    "</BODY>"
    "</HTML>";
    
    NSString *content = [NSString stringWithFormat:html,name,value];
    return content;
}

但其實(shí)我們看出,這樣寫并不舒服,因?yàn)椋?/p>

1:模塊內(nèi)容和代碼混在一起,既不方便閱讀,也不方便更改
2:模版的渲染邏輯使用簡(jiǎn)單的objc [NSString stringWithFormat]來完成,功能單一。在實(shí)際開發(fā)中,我們很可能需要將原始數(shù)據(jù)進(jìn)行二次處理,而這些如果模版渲染模塊不能支持,我們就只能自己手工寫這部分的數(shù)據(jù)二次處理,耗時(shí)耗力,例如:微博的詳情界面,如果微博的發(fā)送時(shí)間小于一天,則需要顯示成“xxx小時(shí)前”,如果小于1分鐘,則需要顯示成“剛剛”。這些界面渲染方法的邏輯如果能夠抽取到專門的排版代碼中,就能清晰很多。

所以我們需要一個(gè)模版引擎,專門復(fù)雜這類的渲染的工作,我個(gè)人使用過的模版MGTemplateEngine(https://github.com/mattgemmell/MGTemplateEngine),它的模版語(yǔ)言比較像Smarty,FreeMarket和Django。另外它可以自己定義Filter,以便實(shí)現(xiàn)上面提到的自定義渲染邏輯,他需要依賴 RegexKit, RegexKit是一個(gè)正則表達(dá)式工具類,提供強(qiáng)大的正則表達(dá)式工具類,提供強(qiáng)大的正則表達(dá)式匹配的替換功能。
不喜歡模版引擎功能太過于復(fù)雜的朋友,也可以嘗試GRMustache(https://github.com/groue/GRMustache),它比MGTemplateEngine,GRMustache的功能更簡(jiǎn)單,另外GRMustache在開源社區(qū)更加活躍,更新更頻繁。
對(duì)于上面的示咧代碼,在使用GRMustache模版后,我們首先需要調(diào)整模版的內(nèi)容:
1:將模版內(nèi)容放在另一個(gè)單獨(dú)的文件中,方便日后更改。
2:將原來的%@,替換{{ name }}的形式。
模版調(diào)整后變成以下內(nèi)容(文件名為template.html):


<HTML>

還沒有結(jié)束……

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,284評(píng)論 4 61
  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 26,079評(píng)論 7 249
  • 1).h文件中 2).m文件中
    YvanLiu閱讀 248評(píng)論 0 0
  • 前兩天看了一部電影叫《我和莎莫的500天》,在看這部片子之前我曾在微博上多次見到男女主角在片中的照片。 男主是我喜...
    王非老吉閱讀 291評(píng)論 1 0
  • 有海的聲音 在神殿的腳下咆哮 是誰(shuí)將自由高高舉起 任由祭壇上熊熊燃燒的烈焰 焚燒—— 在蒼涼的星空 有絢爛的霹靂狂...
    劉漢皇閱讀 211評(píng)論 0 1

友情鏈接更多精彩內(nèi)容