这个文章的名字起的实在是有点长,主要是怕说不清楚。

在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的更多相关文章

  1. 重新想象 Windows 8 Store Apps (49) - 输入: 获取输入设备信息, 虚拟键盘, Tab 导航, Pointer, Tap, Drag, Drop

    [源码下载] 重新想象 Windows 8 Store Apps (49) - 输入: 获取输入设备信息, 虚拟键盘, Tab 导航, Pointer, Tap, Drag, Drop 作者:weba ...

  2. 在 Android 的文字编辑控件 (TEdit) 中, 如何按下 Enter 就隐藏虚拟键盘

    在 Windows 的应用中,我们常常为了让使用者能够快速输入,在Edit元件中的onKeyUp或者 onKeyDown 事件中主动侦测使用者输入的字元是否有换行符号 (Enter),当使用者按下了E ...

  3. 在移动端H5开发中(关于安卓端position:fixed和position:absolute;和虚拟键盘冲突的问题,以及解决方案)

    一.在开发移动端webapp时,我们经常会遇到这样的问题,当我们需要在页面底部固定一个logo或者说明时,往往会采用position:fixed进行固定定位或者absolute定位到最底部 这是一个很 ...

  4. 教你一招:在PowerPoint中自定义可输入文本的占位符

    日常生活中,当我们设计多媒体课件时,默认的版式其实已经够用了.但是,很多时候,我们需要更加个性一点,所以,我们需要自定义很多东西.本文介绍在PowerPoint中自定义可输入文本的占位符. 一.占位符 ...

  5. 如何在cocos2d项目中enable ARC

    如何在cocos2d项目中enable ARC 基本思想就是不支持ARC的代码用和支持ARC的分开,通过xcode中设置编译选项,让支持和不支持ARC的代码共存. cocos2d是ios app开发中 ...

  6. 2. Python中的基本输入、输出、格式化

    本文利用的是Python 3.x版本,建议学习3.x版本 Python中的基本输入.输出.格式化 1. 输入 使用input([prompt])读取一行,将其转换为string类型并返回,input的 ...

  7. delphi中的inpubox,如何能控制它的位置? 10

    https://zhidao.baidu.com/question/153270855.html delphi中的inpubox,如何能控制它的位置? 10 RT ! 前辈!最好你就把那代码都拿出来吧 ...

  8. Java实现 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置

    在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n ...

  9. 【LeetCode】34. 在排序数组中查找元素的第一个和最后一个位置

    34. 在排序数组中查找元素的第一个和最后一个位置 知识点:数组,二分查找: 题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置 ...

随机推荐

  1. iOS- 多线程技术的概述及优点

    1.概述 在iOS开发中: •耗时操作,例如网络图片.视频.歌曲.书籍等资源下载 •游戏中的声音播放   我们可以利用多线程: •充分发挥多核处理器的优势,并发(同时执行)执行任务让系统运行的更快.更 ...

  2. iOS-创建UIScrollerView(封装UIScrollerView)

    创建继承于UIView的类WJImageScrollView,代码实现如下: WJImageScrollView.h #import <UIKit/UIKit.h> /**点击图片bloc ...

  3. 关于如何解决PHPCMS V9内容搜索显示不全问题解决方案

    站长朋友们都晓得只要是开源的PHP程序都会有漏洞存在.如果想完美的建站就需要自己去研究打补丁了.最近很多站长联系小编咨询用phpcms建站当在首页搜索内容的时候有的居然搜索不到.小编感到很是奇怪于是就 ...

  4. linux路由表的配置

    linux路由表的配置 一.原理说明 1.路由表(table)从0到255进行编号,每个编号可以对应一个别名,编号和别名的对应关系在linux下放在/etc/iproute2/rt_tables这个文 ...

  5. 【bzoj3886】[Usaco2015 Jan]Moovie Mooving 状态压缩dp+二分

    题目描述 Bessie is out at the movies. Being mischievous as always, she has decided to hide from Farmer J ...

  6. CentOS yum安装软件包

    yum(Yellowdog Update Modifie)命令是在Fedora和RedHat以及SUSE中基于rpm的软件包管理器,它可以使系统管理人员交互和自动化地更细与管理RPM软件包,能够从指定 ...

  7. C++ 类中成员函数分析

    概述之前对成员变量的分布进行了整理,今天就对成员函数进行整理. 1.非静态成员函数C++的设计准则之一就是:非静态成员函数至少和一般的非成员函数的执行效率相同. 为了实现上衣准则,编译器会对非静态成员 ...

  8. MySQL不支持远程连接的解决办法

    如果mysql不支持远程连接,会出现提示:错误代码是1130,ERROR 1130: Host * is not allowed to connect to this MySQL server ,解决 ...

  9. POJ3469:Dual Core CPU——题解

    http://poj.org/problem?id=3469 题目大意: 两个CPU,处理每个任务有不同的代价,有些对任务如果不在同一个CPU就会增加代价,求最小代价. ——————————————— ...

  10. 洛谷 P3960 列队 解题报告

    P3960 列队 题目描述 \(Sylvia\)是一个热爱学习的女♂孩子. 前段时间,\(Sylvia\)参加了学校的军训.众所周知,军训的时候需要站方阵. \(Sylvia\)所在的方阵中有\(n ...