前言:OC時代就已經熟用鋪開的技術,但在swift卻實現的不夠優雅,網上清一色copy的技術文檔說爛了都只有一種實現方法,8102年了,這種不是很優雅的方式不應該出現在這里。
先說說展開tableview的實現
-
我們一般有兩種方式,但這里我只想討論使用secion實現的方法。即第一層為section,展開層為cell這種。下面是效果圖image.png
類似這種效果的,就需要我們自定義sectionView(創建view,添加控件那些就省略了,這里提一下需要的是,我們自定義的section需要繼承自系統的UITableViewHeaderFooterView,否則無效),給sectionView添加點擊手勢(展開cell,以及箭頭的動畫),給sectionView添加delegate協議。delegate方法.png
通過傳入的標記值改變箭頭方向
箭頭→變成↓的動畫.png
delegate將點擊事件傳遞出去
image.png
到此,sectionView層的自定義就結束了,關鍵的還在controller層
#################################分割線################################# -
controller里面創建自定義的sectionView并指定當前controller為代理
image.png -
這里需要提一下的是,我們的sectionView應該有個flag來記錄當前的展開關閉狀態,一般我們都是在model里面添加一個falg屬性。但是這里為了方便演示,我手動初始化一個flag默認有兩個sectionView并且都是未展開狀態.png
- 這個flag有以下作用:
-
控制row的行數。
image.png
2.控制row高度
image.png
3.控制sectionView的展開動畫(箭頭旋轉,row數據更新)
image.png
到此分歧點就來了,更新數據這一塊,網上清一色使用的是tableview.reloadSection這個方法。甚至我在github上面發現一個800+star的庫也是用的這種方法,其實這種方法基本上能實現展開收縮,但是有一個BUG。不是很優雅,看下圖
42342.gif
42342.gif
當點擊section時,會閃一下,并且箭頭的動畫也不是很自然。網上基本上清一色的都使用這種設計方法
-
下面我將介紹一個更加優雅的方式來實現這個效果。先上圖,再解釋image.png
我們除了reloadSection以外,還可以使用insert/deleteRows的方式,這樣的好處是動態的添加row,界面會過度的更自然平滑,動畫使用的是transform形變,簡單方便。
效果圖.gif
OK,講到這里差不多把我遇到的一些問題理順了一遍,之前動畫點擊有閃一下的效果使我感覺不是很好,所以才有了這邊文章。順便我還想吐槽一下,都8102年了,swift作為一個“未來趨勢”的語言,技術文章也太少了點吧。都停留在2016年- -,希望大家平時有啥奇技淫巧,可以寫出來多多交流~