最近看到微信的标签备注界面的操作体验挺好的,所以自己也想着实现一下,最终实现效果与微信的基本一致,还算是比较满意的_,所以在这里共享给大家,有需要的同学可以到这里下载。效果如下:
当然,这个实现的过程也不是一帆风顺的,之前的想法是使用UICollectionView
来实现这样的效果,这样就可以不需要考虑排版和复用问题。都是做到一半的时候,进行不下去了(还是太菜了。。。T_T),主要是 UITextField
随着输入文本来动态调整位置,如果在当前行中输入长度超过屏幕宽度则需要换到下面一行。这个虽然能够捕获文本变更内容来实时刷新和计算文本框位置,但是由于刷新cell会直接导致UITextField
的焦点失效,并且也存在重用问题(同一个索引位置,在频繁刷新的情况下Cell会出现无法复用问题。。。。这可能是内部实现机制的缘故)。
基于上面的原因,抛弃了UICollectionView
作为基础组件的想法,直接继承UIScrollView
来进行功能实现。VITagListView
虽然基于UIScrollView
,但是内部还是实现了简单复用机制的。在实现的过程里面遇到最主要的问题有两个:
点击标签弹出菜单问题。表面上看非常简单,直接使用UIMenuController就可以实现。但是微信的弹出菜单时,其实键盘还是保持弹出状态的(一般都需要使控件先成为响应者才可以弹出菜单),
VITagListView
中的标签使用的是UIButton
,因此,如果要保证键盘弹出就不能使Button变为响应者,所以在控件里面的菜单操作都是由UITextField
去处理的。退格键删除标签问题。当在
UITextField
没有文本内容的情况下,点击退格键就能够选中和删除标签,在正常的UITextField
代理下是获取不到这个事件的,并且在iOS 8.3之前和之后有所变化,具体可以看VITagField
的deleteBackward
和keyboardInputShouldDelete
方法。
具体实现就不这里细说了,如果有更好的实现方式和改进建议,欢迎与我联系,感谢大家的支持~