最近讀cocoaui原始碼有感,cocoaui原始碼有感
上半年為了做一個ios的應用,引入了cocoaui庫,主要是用來布局ios介面,發現簡化了不少代碼和工作量。因為在寫第一個ios應用的時候,用的代碼布局,在適配4s和6的機型時候,幾乎被搞死,大量的約束定義充斥在代碼中,慘不忍睹。
cocoaui的作者是ssdb的作者ideawu,在微博裡面比較活躍,有問題at他一般很快就會有回應。ssdb是一個類似於redis的nosql資料庫;像這樣一個在用戶端和伺服器領域都有建樹的人還是很少的。我等普普通通的程式員,距離這種大神還是有一些距離,不過不能氣餒,瞭解他們才能接近他們。除了羨慕他們解決問題的能力,還是要學習他們解決問題的思路,以及這種解決了問題還分享的精神。
記得大學的時候,每次學習新的語言的時候,總借用第三方庫做一個詞典,一個天氣預報,計算機或者類似於遊覽器這樣小工具等。比如詞典使用百度詞典api,遊覽器使用的webview,不過那個時候真的想過實現一個遊覽器,自己解析html+css。大學時候做xml的解析還是差很多的,最終也是一行代碼也沒有寫,其實想想有很多xml解析庫可以借鑒來使用的。
說說cocoaui的思路,在布局ios應用介面的時候,即沒有使用xib,也沒有使用storyboard;而是借用web的html+css來做ios的介面布局。整體思路就是借用libxml2庫去解析的html標籤,並且將其轉換成對應的uibutton,uilabel,uiimage,uiview,放置到介面中,至於他們在介面的中的位置,則是通過解析css,然後去設定border,margin,padding,width,height,corlor,text;關於css的解析,作者寫了兩篇文章介紹,http://www.ideawu.net/blog/archives/912.html http://www.ideawu.net/blog/archives/868.html,有興趣可以拜讀一下,思路很清晰。
大家都在說ios的約束布局不適合人理解,可是大部分人還是去適應了。可是cocoaui的作者繞過ios的約束布局,借用web的div+css去實現流式布局,這真是給了我們一個很好的選擇,同時也提供了一個解決問題的思路,不要陷入其中,而是跳出來從新選擇其他的方式。當然能寫cocoaui也是需要很深的技術功底的,比如css的解析。
按照這個思路,我們可以從新定義android的布局方式,不知道大家有沒有想過android的布局檔案是很邋遢的,或者說很囉嗦,很冗餘。如果是一個小型應用;xml的設定檔大小几乎相當於整個代碼檔案的大小了。我們按照cocoaui的思路,也可以定義html+css的方式去布局。
1:在activity裡面,引入xml檔案。
2:使用dom4j去解析xml中的html標籤,並且將這些標籤轉換成android的控制項,比如input(type=button)的轉換成Button,input(type=input)轉換為edittext,span轉換成textview,div轉換成layout。
3:解析css檔案,定義控制項在介面中的位置,比如遇到margin:0 10 0 0,就去擷取button的LinearLayout.LayoutParams,然後調用setMargins函數去設定button的margin,遇到padding:10 0 0 0,同理;遇到color;就去設定button的backgroundColor就可以;等等,就不一一列舉。
這樣是不是就從新定義了android的布局問題,我們甚至可以使用引用css的方式,去定義公用的css方式,這樣能更能簡化布局檔案。也就解決了androidxml布局冗餘的問題。
當然了,這隻是一個思路,talk is cheap,show code!