首先说一下《 UITextView之一 》中的文章存在的bug:
1)在输入全屏文字的拼音,然后点击中文的时候会出现TextView自动跳动,还有就是在粘贴的过程中,TextView会出现大幅度的空白,自动跳转到上面,而自动实现了盲打的功效。(目前在系统上原有功能上的单独限制功能只发现了这个一个BUG)
说一下扩展:
1)对于此方法的用途,不用限制条件的使用上用UITextView可能就不会用到这些方法,然而在项目中为了统一,所以重写了TextView,来方便使用。
2)为了方便使用,添加了,限制输入的个数显示功能(默认是隐藏),用到的时候再显示出来,方便用户使用,拓展性强。
3)增加了placeHolder功能,再输入状态未改变的时候会有提示汉字,在输入文字后提示文字会消失,同样默认是隐藏,方面使用。
4)增加了一下一些委托方法,方便在使用中用到已经输入文字的个数,以及状态改变,而返回必要的值。
好了,开始正文:
首先是BUG:一句简单的话就可以解决在textViewDidChange:(UITextView*)textView中开头加上就可以。
textView.layoutManager.allowsNonContiguousLayout=NO;
这句话的意思是,是否开启非连续布局这个属性,这个是从网上找到了。在ios UITextView bug 输入文字跳动bug问题 (・ˍ・*) - 后来这个人死了... - 博客频道 - CSDN.NET这里,有空大家看看也是一笔概括了。
好了拓展:
从图片中可以看出来,我重写了TextView的类,方便我的项目中用到TextVIew的地方都用到我的类。然而,其中is开头的其实是可以去掉的,但是寻思很久还是没删去的原因:我的初始化类的方式有两种1.代码生成 2.xib中调用,所以为了容错我加上的。
初始化截图2下面的逻辑跟截图1一样所以为了省空间,我就不截了。首先说明一下为什么我截了这个if语句,不能不防啊,原因是:假如代码生成UITextView的时候用了1方法,之后调用2这个initTextView的方法,那么不做判断的话会完全盖掉。(本人掉里面过)
剩下的就是小改动上一篇文章中的代码了,以及增加这些拓展。
改动在倒数第二个return 就是return NO;中加一了句判断,为了更新已经输入的字数。
这个自己看吧,就是 在变动的时候,把提示信息隐藏,以及更新numberLabel的数据,以及要是有代理方法的话,返换给代理方法数据,还有就是当没有限制字数的时候,直接return当做系统的TextView使用。
这个大家可以忽略不记,这个是我们产品做的显示输入字数的时候做不足1个汉字字符显示按一个汉字字符显示, 也就是 我限制80字符,可以输入40个汉字,显示的时候是0/40,当我输入一个f的时候其实是半个汉字正确是0.5/40,但是 显示为1/40,当我再次输入f,现在文字为ff,这时候还是1/40。(本人感觉很是怪异,要么都添加,要么就显示字符,要么就是都按一显示像脉脉一样)。
这个是-(int) JudgementString:(NSString*) string里面的,就是在return的时候都给theNowTextNum赋一下值,好更新数据。
以上就是我重写的TextView,当使用 重写类的委托 的时候,是不走重写类的这些方法的,会走委托者的委托方法。
总结:增加拓展性,以及修改了输入跳动的问题。
ios8以下 不要这样重写TextField控件,因为 ios7当中 textfield.delegate = self会陷入死循环,所以,ios8以上再用吧,本人 现在为了兼容ios7,用回了全部继承UIView的重写机制。
如果要判断字符长度的话,可以看一下我写的另一篇文章iOS 中 英 emoji 字符判断长度。