关于cocos2d-x 中 CCEditBox 的输入位置和IOS虚拟键盘位置不重合的bug
来源:互联网 发布:wind有美国数据吗 编辑:程序博客网 时间:2024/05/16 17:53
原文地址:http://www.cnblogs.com/lan0725/p/3210963.html
感谢作者,简单的一句,解决了问题。
这个文章的名字起的实在是有点长,主要是怕说不清楚。
在IOS上,输入时,我看到过的比较少,就两种,如附件两张图。一个是虚拟键盘的输入框完全是在CCEditBox上,另一张虚拟键盘的输入区域是紧挨着键盘的并且左对齐的。
我的cocos2d版本是2.1rc0-x-2.1.4,貌似是当前最新的。
因为项目需要,我使用了CCEditBox,实现一个聊天的功能。ipad上运行时发现,键盘自带的输入区域既不在CCEditBox上,也没有紧挨着键盘左对齐。
这就是需要我们调整虚拟键盘输入域的位置了。查看了CCEditBoxImplIOS.mm文件,发现方法adjustTextFieldPosition是调整这个文本域的位置的。看逻辑没什么错,为什么不是我需要的效果呢。
现在网上查,很多人说这是CCEditBox的bug,必须要把CCEditBox对象加到大小是全屏的父节点中。。。我晕,怎么可能,界面层级关系有要求,节点很多,父节点不可能是全屏的节点。 还有人说设置position的时候取父节点的position。还有人说必须要把CCEditBox先加到父节点中去,然后设置其position。这些我都尝试了。发现,啥都没用。
然后仔细研究了adjustTextFieldPosition方法,代码如下。
1 void CCEditBoxImplIOS::adjustTextFieldPosition()2 {3 CCSize contentSize = m_pEditBox->getContentSize();4 CCRect rect = CCRectMake(0, 0, contentSize.width, contentSize.height);5 rect = CCRectApplyAffineTransform(rect, m_pEditBox->nodeToWorldTransform());6 7 CCPoint designCoord = ccp(rect.origin.x, rect.origin.y + rect.size.height);8 [m_systemControl setPosition:convertDesignCoordToScreenCoord(designCoord, m_bInRetinaMode)];9 }
其中第5行的nodeToWorldTransform方法代码是这样的,很明显,都已经向上取了所有父节点来把当前节点的坐标进行转换的。
1 CCAffineTransform CCNode::nodeToWorldTransform()2 {3 CCAffineTransform t = this->nodeToParentTransform();4 5 for (CCNode *p = m_pParent; p != NULL; p = p->getParent())6 t = CCAffineTransformConcat(t, p->nodeToParentTransform());7 8 return t;9 }
所以问题就在调用adjustTextFieldPosition方法的时机了。发现只在setPosition 和 onEnter 两个方法里边调用。这样当你还没有加入父节点时,nodeToWorldTransform方法的for循环其实起不了多大作用,就是没法将你当前CCEditBox的坐标转换为全屏这样的坐标了。
所以我得解决方法是,在打开键盘时,也就是openKeyboard方法中调用adjustTextFieldPosition,结果完全OK了。
1 void CCEditBoxImplIOS::openKeyboard()2 {3 m_pLabel->setVisible(false);4 m_pLabelPlaceHolder->setVisible(false);5 6 m_systemControl.textField.hidden = NO;7 adjustTextFieldPosition();// add by elan 2013-07-248 [m_systemControl openKeyboard];9 }
- 关于cocos2d-x 中 CCEditBox 的输入位置和IOS虚拟键盘位置不重合的bug
- 关于cocos2d-x 中 CCEditBox 的输入位置和IOS虚拟键盘位置不重合的bug
- cocos2d-x中CCEditBox 在iOS和安卓平台下 位置偏移的问题解决方法
- cocos2d-x 输入框CCEditBox的使用
- [Quick-x]移动CCEditbox的父对象导致输入框位置偏移问题
- cocos2d-x CCEditBox 字符不能显示完全的bug
- Cocos2d-x 2.2.2版本CCEditbox 遇到的bug
- Cocos2d-x中编辑框CCEditBox的使用
- Cocos2d-x中编辑框CCEditBox的使用
- cocos2d-x中对象的位置,旋转,缩放
- cocos2d-x中ScrollView内的元素位置问题
- cocos2d-x-3.9中UserDefault保存的XML文件位置
- Cocos2d—X游戏开发之CCEditBox(虚拟键盘高级篇)(十)
- cocos2d-x 有关CCEditBox设置除输入框以外的可点击触发区域
- CCEditBox的bug修正
- cocos2d-x如何解决 CCEditBox在 安卓平台下面不响应touch的问题
- iOS根据输入的位置获取经纬度
- 定义一个由整数组成的数组,然后输入一个整数X,如果X不在此数组中,返回小于X的最大数的位置i和大于X的最小数的位置j
- java实现字符的简单加密和解密
- springmvc 匹配'/'的问题
- 一路Hadoop-- 5、在Linux上安装JDK-1,仅安装
- 网络爬虫(二):利用urllib2通过指定的URL抓取网页内容
- 关于cocos2d-x播放动画时获取第几帧的另一种方法
- 关于cocos2d-x 中 CCEditBox 的输入位置和IOS虚拟键盘位置不重合的bug
- C#异步编程
- oracle 两表数据对比---minus
- 一月总结
- 丁老师的作业_修改并运行“简单签到程序”
- javafx-binding object model to the tableview
- 事务+事务的四大特性+隔离性的具体分析+数据库连接池
- Oracle UPK
- 求1+2+…+n,要求不能使用乘除法等