UITableViewCell的展開與收縮的實現思路
現在項目中很多地方都會用到,所以我這里介紹一種可以復用的思路,這與文章后面的Swift的實現思路不同,具體大家可自行對比。
開始
先說一下UITableView的兩個代理:cellForRowAtIndexPath
和heightForRowAtIndexPath
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
我們要實現UITableView的展開與收縮就需要在每次點擊收縮/展開
按鈕的時候執行heightForRowAtIndexPath
方法,讓返回的高度值不同,這樣我們就可以顯示不同高度的cell,同時要能修改數據源cellForRowAtIndexPath
,讓UITableView顯示最新的數據
我這里做的是,只對這個heightForRowAtIndexPath
進行修改,每次修改的時候,我就計算計算里面Label(目前假定cell中只顯示文字)frame,而對cell的內容不進行修改。修改label的高度后,label中得文字被遮蓋。也可以實現目前的效果
但是由於UITableView的cellForRowAtIndexPath
執行在heightForRowAtIndexPath
后面,也就是我們只有在heightForRowAtIndexPath
現行計算高度后,才會執行cellForRowAtIndexPath
顯示cell的內容,所以為了防止重復計算,我們這里除了正常用到的model類外,再聲明一個frameModel
類,里面放:
- 正常的Model
- cell中子控件的frame
- cell的高度
這樣我們就可以用frameModel來替換常規的model,在拿到frameModel后就可以計算出cell的高度,同時包括cell的子控件的frame,這樣當我們點擊收縮/展開
按鈕的時候,就可以實現修改frameModel就可以實現cell的展開與收縮效果了。
Swift語言也有相關的實現,不過用的是AutoLayout,大家也可以參考
這里重復一下,這篇文章中Demo項目的下載,請點擊
作者:Darren
微博:@IT_攻城師
github:@Darren90
博客:http://www.cnblogs.com/fengtengfei/
歡迎您的訪問...