最近看到微信的标簽備注界面的操作體驗挺好的,是以自己也想着實作一下,最終實作效果與微信的基本一緻,還算是比較滿意的_,是以在這裡共享給大家,有需要的同學可以到這裡下載下傳。效果如下:
當然,這個實作的過程也不是一帆風順的,之前的想法是使用
UICollectionView
來實作這樣的效果,這樣就可以不需要考慮排版和複用問題。都是做到一半的時候,進行不下去了(還是太菜了。。。T_T),主要是
UITextField
随着輸入文本來動态調整位置,如果在目前行中輸入長度超過螢幕寬度則需要換到下面一行。這個雖然能夠捕獲文本變更内容來實時重新整理和計算文本框位置,但是由于重新整理cell會直接導緻
UITextField
的焦點失效,并且也存在重用問題(同一個索引位置,在頻繁重新整理的情況下Cell會出現無法複用問題。。。。這可能是内部實作機制的緣故)。
基于上面的原因,抛棄了
UICollectionView
作為基礎元件的想法,直接繼承
UIScrollView
來進行功能實作。
VITagListView
雖然基于
UIScrollView
,但是内部還是實作了簡單複用機制的。在實作的過程裡面遇到最主要的問題有兩個:
- 點選标簽彈出菜單問題。表面上看非常簡單,直接使用UIMenuController就可以實作。但是微信的彈出菜單時,其實鍵盤還是保持彈出狀态的(一般都需要使控件先成為響應者才可以彈出菜單),
中的标簽使用的是VITagListView
,是以,如果要保證鍵盤彈出就不能使Button變為響應者,是以在控件裡面的菜單操作都是由UIButton
去處理的。UITextField
- 倒退鍵删除标簽問題。當在
沒有文本内容的情況下,點選倒退鍵就能夠選中和删除标簽,在正常的UITextField
代理下是擷取不到這個事件的,并且在iOS 8.3之前和之後有所變化,具體可以看UITextField
的VITagField
和deleteBackward
方法。keyboardInputShouldDelete
具體實作就不這裡細說了,如果有更好的實作方式和改進建議,歡迎與我聯系,感謝大家的支援~