CCEditBox高度设置过低时文字被截掉一半的问题及解决方式(iOS环境)
2013-06-14 11:19
399 查看
最近在使用cocos2d-x的一个扩展空间CCEditBox时遇到一个问题:当CCEditBox初始化时设置了过低的高度,会导致文本输入框中的文字只能显示一部分,剩余的地方都被切掉了。
这个问题我一开始还以为是字体大小的问题。但是CCEditBox并没有提供设置字体大小的接口。因此我只能往CCEditBox的内部代码去寻找。
通过一番搜索,我发现CCEditBox内部的机制是根据当前所处的不同平台,来调用ios或者android原生的TextField。由于我是在iOS环境下,因此我直接寻找iOS下文本框实现的类和方法,最终我找到了这个类:EditBoxImplIOS。
在这个类的初始化方法中,可以看到原作者创建了一个CustomUITextField的类(实际上是继承自UITextField)。随后可以看到一句代码:
这句代码设置了TextField的字体大小。因此我首先就将字体的大小改成了frameRect.size.height/3。
修改完后进行调试,我发现确实文字都能显示出来了,但文字变得太小,和想要的结果相去甚远。所以我就开始寻找是否有其他方法解决这个问题。
然后我找到了那个关键点:CustomUITextField
这个类是作者自己写的,继承自UITextField的文本输入框。查看了这个类的成员函数以后,发现在这个类中重定义了UITextField的一个方法:
- (CGRect)textRectForBounds:(CGRect)bounds;
然而,在这个方法中,作者设置了一个padding变量,通过这个padding变量控制文本输入框真正显示的内容的范围。
而正是由于这个padding变量被设置成5.0的像素值,直接导致了目前这个问题:
例如我给CCEditBox设置的高度为20像素。那扣除上下各5.0的padding,真正能用来显示文字的区域只有10个像素。而这时候字体的大小是20 * 2 / 3,约13个像素,明显大于可显示区域的10像素。因此导致了CCEditBox文本框的文字被截掉一部分的问题。
解决方法:
目前想到的解决方法就是修改这个padding值。基本的想法就是将padding值修改成与CCEditBox的大小有所关联,这样就能保证这个padding不会大到遮住一半文字这种奇葩的问题发生。
具体的代码修改如下:
这段代码根据设置TextField时候给到的bounds的大小,来判断padding要设置成怎么样的数值。
这边之所以判断了bounds的宽度和高度的大小,主要是考虑到可能有些比较奇特的输入框会出现宽度比高度更小的情况。这样的话padding如果只考虑高度,可能会导致横向的文字被遮掉。
padding设置为minValueOfSize的1/20,是因为当我查这个问题时,我设置的CCEditBox高度正好是20,将padding设置为1像素能保证无论如何都不会遮掉文字。读者可以根据自己的需求随意修改这个比值。
这个问题我一开始还以为是字体大小的问题。但是CCEditBox并没有提供设置字体大小的接口。因此我只能往CCEditBox的内部代码去寻找。
通过一番搜索,我发现CCEditBox内部的机制是根据当前所处的不同平台,来调用ios或者android原生的TextField。由于我是在iOS环境下,因此我直接寻找iOS下文本框实现的类和方法,最终我找到了这个类:EditBoxImplIOS。
在这个类的初始化方法中,可以看到原作者创建了一个CustomUITextField的类(实际上是继承自UITextField)。随后可以看到一句代码:
textField_.font = [UIFont systemFontOfSize:frameRect.size.height*2/3];
这句代码设置了TextField的字体大小。因此我首先就将字体的大小改成了frameRect.size.height/3。
修改完后进行调试,我发现确实文字都能显示出来了,但文字变得太小,和想要的结果相去甚远。所以我就开始寻找是否有其他方法解决这个问题。
然后我找到了那个关键点:CustomUITextField
这个类是作者自己写的,继承自UITextField的文本输入框。查看了这个类的成员函数以后,发现在这个类中重定义了UITextField的一个方法:
- (CGRect)textRectForBounds:(CGRect)bounds;
然而,在这个方法中,作者设置了一个padding变量,通过这个padding变量控制文本输入框真正显示的内容的范围。
而正是由于这个padding变量被设置成5.0的像素值,直接导致了目前这个问题:
例如我给CCEditBox设置的高度为20像素。那扣除上下各5.0的padding,真正能用来显示文字的区域只有10个像素。而这时候字体的大小是20 * 2 / 3,约13个像素,明显大于可显示区域的10像素。因此导致了CCEditBox文本框的文字被截掉一部分的问题。
解决方法:
目前想到的解决方法就是修改这个padding值。基本的想法就是将padding值修改成与CCEditBox的大小有所关联,这样就能保证这个padding不会大到遮住一半文字这种奇葩的问题发生。
具体的代码修改如下:
- (CGRect)textRectForBounds:(CGRect)bounds { float minValueOfSize = bounds.size.width < bounds.size.height ? bounds.size.width : bounds.size.height; float padding = minValueOfSize / 20; return CGRectMake(bounds.origin.x + padding, bounds.origin.y + padding, bounds.size.width - padding*2, bounds.size.height - padding*2); }
这段代码根据设置TextField时候给到的bounds的大小,来判断padding要设置成怎么样的数值。
这边之所以判断了bounds的宽度和高度的大小,主要是考虑到可能有些比较奇特的输入框会出现宽度比高度更小的情况。这样的话padding如果只考虑高度,可能会导致横向的文字被遮掉。
padding设置为minValueOfSize的1/20,是因为当我查这个问题时,我设置的CCEditBox高度正好是20,将padding设置为1像素能保证无论如何都不会遮掉文字。读者可以根据自己的需求随意修改这个比值。
相关文章推荐
- iOS:解决UITextView自适应高度粘贴大量文字导致显示不全的问题
- 设置背景图片的两种方式,并解决手机端背景图片高度自适应问题
- 设置背景图片的两种方式,并解决手机端背景图片高度自适应问题
- 关于Cocos2d-x 3.0正式版 粒子问题在IOS上正常显示,在Android下有问题的解决方式
- python MySQLdb在windows环境下的快速安装、问题解决方式
- ios开发――解决UICollectionView的cell间距与设置不符问题
- IOS UITextfield设置右对齐后 开头空格无法右对齐的解决方式
- iOS-UIWebview设置超时、加载失败、重新加载等问题解决
- Objective-C文字换行方式(解决英文在行末时的换行问题)
- label和span标签设置宽度width无效问题的解决方式
- 关于VMWare Workstation中安装的linux虚拟机设置桥接方式无法联网问题的解决
- MFC解决设置控件内容 文字重叠问题 (SetWindowText)
- HTML给div设置百分比高度无效的解决方式
- iOS-解决iOS8及以上设置applicationIconBadgeNumber报错的问题
- ios设备下使用iframe时 fixed失效以及iframe无法设置高度的问题
- iOS 从一串文字中找到某个文字,设置某文字的颜色/富文本问题
- iOS--LaunchImage启动页设置及问题解决
- python MySQLdb在windows环境下的快速安装、问题解决方式
- Vue 动态设置网站title 解决ios在微信浏览器中不生效问题
- VS2010解决对话框设置背景图片和文字重叠问题