原文地址:http://www.reibang.com/p/a5a898a63c07
今天看到iOS實現(xiàn)多個可變cell復(fù)雜界面的制作這篇文章摔刁,大致看了一下源碼读第。感覺沒有真的解決問題辨嗽,而且局限性很大症歇,不能保證動態(tài)行高,性能也不是很好勉吻。今天結(jié)合我們自己的工程监婶,談?wù)勈褂胻ableView來構(gòu)建復(fù)雜界面的局限性,換句話說齿桃,一旦視圖足夠復(fù)雜惑惶,我們就應(yīng)該根據(jù)情況不同決定是否使用tableView,或者將固定的部分抽離出來,減少在tableView中的邏輯判斷。
置頂:
WechatIMG19.jpeg
1> 如何隱藏顯示的視圖短纵?
// 因為你不知道是一個button带污,還是什么,所以傳入id使用id類型香到,避免警告??- (void)hiddenView:(id)view? constant:(NSLayoutConstraint)viewConstant{? ? ? ? viewConstant.constant =0.0f;? ? ? ? view.hidden =YES;? ? }
2>五行文本如何展開和隱藏鱼冀?
推薦一個第三方庫? ? TLAttributedLabel。注意: 該庫有很多內(nèi)存泄漏的問題悠就,請使用的同志自行修正千绪。
3>類似iOS實現(xiàn)多個可變cell復(fù)雜界面的制作博主這樣的,既然都是行高梗脾,也不用動態(tài)計算的荸型,我建議這樣用:
如果界面有很多都是可以固定下來的。你比如說商品的圖片炸茧,商品的名稱瑞妇,商品價格,商品是否減價等等信息梭冠。為何不單獨出來成為一個視圖辕狰。那就不需要加入到tableView的邏輯判斷里了。剩下就是評論了妈嘹,評論可以單獨用tableView來處理柳琢,
為何不用枚舉,在創(chuàng)建之初润脸,就對數(shù)據(jù)進行處理柬脸,確定總共需加載的類型,最后就確定可能要加載cell的類型毙驯。對數(shù)據(jù)提早進行處理倒堕,能讓開發(fā)人員在后期處理越舒服。 前期你做的越多爆价,后期越好判斷垦巴。無非是組合判斷。
typedefNS_ENUM(NSInteger,NIMKitTeamCardRowItemType) {TeamCardRowItemTypeCommon,TeamCardRowItemTypeTeamMember,TeamCardRowItemTypeRedButton,TeamCardRowItemTypeBlueButton,TeamCardRowItemTypeSwitch,};
在控制器中你可能這樣做:
WechatIMG16.jpeg
對于復(fù)雜的View铭段,你可以用storyboard或者xib進行布局骤宣,然后用類來綁定視圖,把界面元素都劃分為不同的類(利用storyboard序愚、xib和代碼)憔披,這樣容易維護。
下邊用項目中真實的例子爸吮,看一下究竟怎么做更加合理芬膝。
WechatIMG6.jpeg
WechatIMG7.jpeg
WechatIMG8.jpeg
分析界面元素如下:
1:頂部為滾動視圖,展示產(chǎn)品相關(guān)信息形娇。(固定)
2:輪次锰霜,瀏覽次數(shù),關(guān)注都是固定的桐早。打碼的地方也是固定的癣缅,可以為一個或者是兩個元素。(固定)
3:緊接下來的項目定位(不固定)哄酝、項目介紹(不固定)所灸、核心競爭力(不固定),團隊介紹(不固定)等等都是不確定是否存在的信息炫七。每個點如果超過五行就必須有閱讀更多的點擊事件爬立,展開相應(yīng)的更多信息(不固定)。
4:更多信息万哪,根據(jù)服務(wù)端返回的數(shù)據(jù)侠驯,確定是否展示。(不固定)
5:相關(guān)鏈接奕巍,可有可無吟策。(不固定)
6:相似項目,可有可無的止。(不固定)
如此多的不固定因素檩坚,加之行高信息。那么使用tableView作為整體的大結(jié)構(gòu),顯然是不適合的匾委。為什么呢拖叙?
因為行數(shù)不確定,行高不確定赂乐,內(nèi)容不確定薯鳍。這種條件下,如果使用tableView作為整體的大結(jié)構(gòu)挨措,需要做N多的邏輯判斷挖滤。最后隨著版本的迭代很難調(diào)整。為以后的產(chǎn)品更迭埋下了大坑浅役。
那么怎么解決這個問題斩松,解決思路的宗旨是:盡量減少邏輯判斷。避免更多的耦合觉既。
1:固定的視圖進行封裝惧盹,隔離出來。
2: 不固定的視圖單獨處理奋救。設(shè)置約束信息等岭参。
3:整體采用scrollView作為底視圖,在其上進行視圖的添加和移除操作尝艘。
4:鑒于產(chǎn)品還有一個特殊的功能:在向下滾動的時候演侯,頂部的滾動視圖是遮蓋在- 滾上來視圖的下邊的,給人一種遮蓋的效果背亥。最上邊需要固定一個View用于展示秒际。
WechatIMG9.jpeg
這個對XIB 使用約束的要求相對高一點,必須熟練狡汉。然后理清楚視圖和視圖之間的關(guān)系之后就可以根據(jù)UI規(guī)范進行約束的調(diào)整了娄徊。
最后在config文件中,配置視圖的一些信息盾戴。比如:
WechatIMG10.jpeg
在我上一家公司中寄锐,在訂單界面,因為邏輯很復(fù)雜尖啡,而且需求變更比較頻繁橄仆,所以也是采用這種方式去解決問題。最后我們需要改動的地方真的很少衅斩,除非是大動盆顾,否則只需要在xib中重新設(shè)置約束就可以了。