前言:OC時代就已經(jīng)熟用鋪開的技術(shù)徽惋,但在swift卻實現(xiàn)的不夠優(yōu)雅课梳,網(wǎng)上清一色copy的技術(shù)文檔說爛了都只有一種實現(xiàn)方法,8102年了芜果,這種不是很優(yōu)雅的方式不應(yīng)該出現(xiàn)在這里。
先說說展開tableview的實現(xiàn)
-
我們一般有兩種方式融师,但這里我只想討論使用secion實現(xiàn)的方法右钾。即第一層為section,展開層為cell這種旱爆。下面是效果圖
類似這種效果的舀射,就需要我們自定義sectionView(創(chuàng)建view,添加控件那些就省略了怀伦,這里提一下需要的是,我們自定義的section需要繼承自系統(tǒng)的UITableViewHeaderFooterView脆烟,否則無效),給sectionView添加點擊手勢(展開cell空镜,以及箭頭的動畫)浩淘,給sectionView添加delegate協(xié)議。
通過傳入的標記值改變箭頭方向
delegate將點擊事件傳遞出去
到此吴攒,sectionView層的自定義就結(jié)束了张抄,關(guān)鍵的還在controller層
#################################分割線################################# -
controller里面創(chuàng)建自定義的sectionView并指定當前controller為代理
-
這里需要提一下的是,我們的sectionView應(yīng)該有個flag來記錄當前的展開關(guān)閉狀態(tài)洼怔,一般我們都是在model里面添加一個falg屬性署惯。但是這里為了方便演示,我手動初始化一個flag
- 這個flag有以下作用:
-
控制row的行數(shù)镣隶。
2.控制row高度
3.控制sectionView的展開動畫(箭頭旋轉(zhuǎn)极谊,row數(shù)據(jù)更新)
到此分歧點就來了,更新數(shù)據(jù)這一塊安岂,網(wǎng)上清一色使用的是tableview.reloadSection這個方法轻猖。甚至我在github上面發(fā)現(xiàn)一個800+star的庫也是用的這種方法,其實這種方法基本上能實現(xiàn)展開收縮域那,但是有一個BUG咙边。不是很優(yōu)雅,看下圖
當點擊section時,會閃一下,并且箭頭的動畫也不是很自然次员。網(wǎng)上基本上清一色的都使用這種設(shè)計方法
-
下面我將介紹一個更加優(yōu)雅的方式來實現(xiàn)這個效果败许。先上圖,再解釋
我們除了reloadSection以外淑蔚,還可以使用insert/deleteRows的方式市殷,這樣的好處是動態(tài)的添加row,界面會過度的更自然平滑,動畫使用的是transform形變刹衫,簡單方便醋寝。
OK搞挣,講到這里差不多把我遇到的一些問題理順了一遍,之前動畫點擊有閃一下的效果使我感覺不是很好甥桂,所以才有了這邊文章柿究。順便我還想吐槽一下,都8102年了黄选,swift作為一個“未來趨勢”的語言,技術(shù)文章也太少了點吧婶肩。都停留在2016年- -办陷,希望大家平時有啥奇技淫巧,可以寫出來多多交流~