关于cocos2d-x 中 CCEditBox 的输入位置和IOS虚拟键盘位置不重合的bug
这个文章的名字起的实在是有点长,主要是怕说不清楚。
在IOS上,输入时,我看到过的比较少,就两种,如附件两张图。一个是虚拟键盘的输入框完全是在CCEditBox上,另一张虚拟键盘的输入区域是紧挨着键盘的并且左对齐的。


我的cocos2d版本是2.1rc0-x-2.1.4,貌似是当前最新的。
因为项目需要,我使用了CCEditBox,实现一个聊天的功能。ipad上运行时发现,键盘自带的输入区域既不在CCEditBox上,也没有紧挨着键盘左对齐。
这就是需要我们调整虚拟键盘输入域的位置了。查看了CCEditBoxImplIOS.mm文件,发现方法adjustTextFieldPosition是调整这个文本域的位置的。看逻辑没什么错,为什么不是我需要的效果呢。
现在网上查,很多人说这是CCEditBox的bug,必须要把CCEditBox对象加到大小是全屏的父节点中。。。我晕,怎么可能,界面层级关系有要求,节点很多,父节点不可能是全屏的节点。 还有人说设置position的时候取父节点的position。还有人说必须要把CCEditBox先加到父节点中去,然后设置其position。这些我都尝试了。发现,啥都没用。
然后仔细研究了adjustTextFieldPosition方法,代码如下。
void CCEditBoxImplIOS::adjustTextFieldPosition()
{
CCSize contentSize = m_pEditBox->getContentSize();
CCRect rect = CCRectMake(, , contentSize.width, contentSize.height);
rect = CCRectApplyAffineTransform(rect, m_pEditBox->nodeToWorldTransform()); CCPoint designCoord = ccp(rect.origin.x, rect.origin.y + rect.size.height);
[m_systemControl setPosition:convertDesignCoordToScreenCoord(designCoord, m_bInRetinaMode)];
}
其中第5行的nodeToWorldTransform方法代码是这样的,很明显,都已经向上取了所有父节点来把当前节点的坐标进行转换的。
CCAffineTransform CCNode::nodeToWorldTransform()
{
CCAffineTransform t = this->nodeToParentTransform(); for (CCNode *p = m_pParent; p != NULL; p = p->getParent())
t = CCAffineTransformConcat(t, p->nodeToParentTransform()); return t;
}
所以问题就在调用adjustTextFieldPosition方法的时机了。发现只在setPosition 和 onEnter 两个方法里边调用。这样当你还没有加入父节点时,nodeToWorldTransform方法的for循环其实起不了多大作用,就是没法将你当前CCEditBox的坐标转换为全屏这样的坐标了。
所以我得解决方法是,在打开键盘时,也就是openKeyboard方法中调用adjustTextFieldPosition,结果完全OK了。
void CCEditBoxImplIOS::openKeyboard()
{
m_pLabel->setVisible(false);
m_pLabelPlaceHolder->setVisible(false); m_systemControl.textField.hidden = NO;
adjustTextFieldPosition();// add by elan 2013-07-24
[m_systemControl openKeyboard];
}
关于cocos2d-x 中 CCEditBox 的输入位置和IOS虚拟键盘位置不重合的bug的更多相关文章
- 重新想象 Windows 8 Store Apps (49) - 输入: 获取输入设备信息, 虚拟键盘, Tab 导航, Pointer, Tap, Drag, Drop
[源码下载] 重新想象 Windows 8 Store Apps (49) - 输入: 获取输入设备信息, 虚拟键盘, Tab 导航, Pointer, Tap, Drag, Drop 作者:weba ...
- 在 Android 的文字编辑控件 (TEdit) 中, 如何按下 Enter 就隐藏虚拟键盘
在 Windows 的应用中,我们常常为了让使用者能够快速输入,在Edit元件中的onKeyUp或者 onKeyDown 事件中主动侦测使用者输入的字元是否有换行符号 (Enter),当使用者按下了E ...
- 在移动端H5开发中(关于安卓端position:fixed和position:absolute;和虚拟键盘冲突的问题,以及解决方案)
一.在开发移动端webapp时,我们经常会遇到这样的问题,当我们需要在页面底部固定一个logo或者说明时,往往会采用position:fixed进行固定定位或者absolute定位到最底部 这是一个很 ...
- 教你一招:在PowerPoint中自定义可输入文本的占位符
日常生活中,当我们设计多媒体课件时,默认的版式其实已经够用了.但是,很多时候,我们需要更加个性一点,所以,我们需要自定义很多东西.本文介绍在PowerPoint中自定义可输入文本的占位符. 一.占位符 ...
- 如何在cocos2d项目中enable ARC
如何在cocos2d项目中enable ARC 基本思想就是不支持ARC的代码用和支持ARC的分开,通过xcode中设置编译选项,让支持和不支持ARC的代码共存. cocos2d是ios app开发中 ...
- 2. Python中的基本输入、输出、格式化
本文利用的是Python 3.x版本,建议学习3.x版本 Python中的基本输入.输出.格式化 1. 输入 使用input([prompt])读取一行,将其转换为string类型并返回,input的 ...
- delphi中的inpubox,如何能控制它的位置? 10
https://zhidao.baidu.com/question/153270855.html delphi中的inpubox,如何能控制它的位置? 10 RT ! 前辈!最好你就把那代码都拿出来吧 ...
- Java实现 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置
在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n ...
- 【LeetCode】34. 在排序数组中查找元素的第一个和最后一个位置
34. 在排序数组中查找元素的第一个和最后一个位置 知识点:数组,二分查找: 题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置 ...
随机推荐
- python学习笔记03:python的核心数据类型
从根本上讲,Python是一种面向对象的语言.它的类模块支持多态,操作符重载和多重继承等高级概念,并且以Python特有的简洁的语法和类型,OOP十分易于使用.Python的语法简单,容易上手. Py ...
- iOS- xib(nib) 的重用(在有些情况下有利于加快项目功能的实现)
0.前言 在项目开发中,我们经常会碰到,某些视图View 内部基本空间都一样,只是数据不同,这时,我们可以用xib来将这个视图封装起来多次重用, (例如,大小固定 控件固定的TableViewCell ...
- Python ZKPython 安装
1.由于python客户端依赖c的客户端所以要先安装c版本的客户端cd zookeeper-3.4.5/src/c./configuremake make install 2.下载python扩展包, ...
- java.awt.AWTError: Can't connect to X11 window server using ':20' as the value of the DISPLAY variable
1.使用pio在Linux服务器上创建window文件时,需要使用到Linux的图形界面服务,出现以下问题需确认用户权限. 参考文献:https://zhidao.baidu.com/question ...
- jsp当做第二个servlet request的生命周期 请求 响应 不管中间经历多少个servlet 只要最后一个serlvt执行后 则生命周期结束 request的域消失
jsp当做第二个servlet request的生命周期 请求 响应 不管中间经历多少个servlet 只要最后一个serlvt执行后 则生命周期结束 request的域消失
- SPFA判負環
馬上就退役了,時間不足就不多介紹了 反正DFS是會T飛的,BFS就沒關係了qwq #include<cmath> #include<queue> #include<cst ...
- NOIP1998 提高组
[NOIP2002] 提高组 T2.联接数 算法:贪心+字符串处理 [问题分析]: 按整数对应的字符串大到小连接,因为题目的例子都符合,但是不难找到反例:12 121 应该组成12121而非121 ...
- [洛谷P5205]【模板】多项式开根
题目大意:给你$n$项多项式$A(x)$,求出$B(x)$满足$B^2(x)\equiv A(x)\pmod{x^n}$ 题解:考虑已经求出$B_0(x)$满足$B_0^2(x)\equiv A(x) ...
- Android 数据库存储之db4o
在Android中,使用数据库除了可以使用Android内嵌的SQLite,还可以使用db4odb4o是嵌入式的面向对象的数据库,是基于对象的数据库,操作的数据本身就是对象.特点:对象以其本身的方式来 ...
- BZOJ2427:[HAOI2010]软件安装——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=2427 https://www.luogu.org/problemnew/show/P2515 现在 ...