最近在使用cocos2d-x的一个扩展空间CCEditBox时遇到一个问题:当CCEditBox初始化时设置了过低的高度,会导致文本输入框中的文字只能显示一部分,剩余的地方都被切掉了。

这个问题我一开始还以为是字体大小的问题。但是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像素能保证无论如何都不会遮掉文字。读者可以根据自己的需求随意修改这个比值。

posted on 2013-06-14 11:19  eagley  阅读(2163)  评论(0编辑  收藏  举报