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é)束……