在日常構(gòu)建UI過程中,我們會遇到很多實用TableView的機會。又有很多時候,會遇到需要自定義適配cell高度的時候,但也有些UI設(shè)計需要我們在展示的時候,只需要展示部分?jǐn)?shù)據(jù),只有在用戶進行某一項Action的時候才會展示完整的數(shù)據(jù)。
1、前提
在Storyboard和xib的使用中,有一個很有用的東西,叫做autoLayout自動布局,就是說在構(gòu)建Cell的時候,只要將布局的約束寫好,將Cell的上下約束撐起來,當(dāng)UILabel自動換行的時候,會將Cell的height自適應(yīng)到合適的大小。
當(dāng)然,使用是有前提的:
self.tableView.estimatedRowHeight = rowHeight;
self.tableView.rowHeight = UITableViewAutomaticDimension;
使用自動布局之前,需要將
tableview
的高度進行設(shè)置為自動布局高度,然后需要設(shè)置一個預(yù)設(shè)高度,這樣之后才會根據(jù)內(nèi)部數(shù)據(jù),將Cell的高度撐起來。
2、實現(xiàn)邏輯
1、進入Tableview的時候,對于UILabel的NSLayoutConstraint
要設(shè)置成一個定值,然后在點擊擴展Button 的時候,將label.text
的值經(jīng)過計算之后,得出與之相適應(yīng)的高度,然后賦值給UILabel的NSLayoutConstraint
,刷新這個Cell。
2、當(dāng)擴展之后,點擊Button需要將UILabel的NSLayoutConstraint
設(shè)置成默認(rèn)的初始高度,并刷新Cell.
3、當(dāng)label.text
的文字不需要擴展的時候,需要對擴展Button做隱藏處理。
4、需要知道當(dāng)前Cell是否已經(jīng)展開的狀態(tài),這個需要用數(shù)組儲存。
3、部分代碼解析
3.1TableveiwCell部分
每一個button點擊需要一個Delegate,用來向controller傳遞點擊事件以及點擊cell的信息。
這個接口用來接收賦值給lbShowText的string,至于為什么沒有直接用
label.text
,下面會簡單說說。有些字符串很短的情況下,就不需要擴展,所以需要隱藏button,所以在這里重寫了showStr的set方法。
3.2TableveiwController部分
self.expandStatus這二個數(shù)組就是用來儲存是否已經(jīng)擴展的狀態(tài),每一次點擊button之后,需要根據(jù)狀態(tài)替換數(shù)組元素。
4、可能遇到的問題
也是之前的一個項目發(fā)現(xiàn)的這個問題,在刷新Cell的時候,有時候會遇到tableview的CGFloat會發(fā)生改變,就是說,tableview會滑動。
所以在翻遍StackOverFlow之后,自己總結(jié)了這么一個辦法,有效,可用!
當(dāng)我抓取log的時候會給我這些信息,大概意思就是某幾個Constraint出現(xiàn)了問題,我的解決方案是修改某一個約束的
priority
來解決問題。
代碼基本功能實現(xiàn),但是代碼邏輯上肯定還有優(yōu)化的余地,后面我會繼續(xù)優(yōu)化我的這部分代碼,如有問題,請各位指正。點擊進入Github