使用CCEDitBox需要实现接口CCEditBoxDelegate
virtualvoid editBoxEditingDidBegin(CCEditBox* editBox) {}; //开始编辑
virtualvoid editBoxTextChanged(CCEditBox* editBox,conststd::string& text) {}; //进行便捷内容修改
virtualvoid editBoxEditingDidEnd(CCEditBox* editBox) {}; //结束编辑
virtualvoid editBoxReturn(CCEditBox* editBox) =0; //返回
触发CCEditBox控件 几个虚函数调用顺序:
进行内容修改,之后点键盘确定键
开始编辑 ____________________________________>结束编辑----------------》返回
|
|
|不进行内容修改 直接点屏幕没有键盘的位置
------------------------------------------------------------》结束编辑--------------》返回
CCEditBox触发的时候,触摸事件不能传递给它所在的层。
iOS 控件UItextField、
接口UITextFieldDelegate
要实现的函数
- (void)textFieldDidBeginEditing:(UITextField *)textField; //开始编辑
- (void)textFieldDidEndEditing:(UITextField *)textField; //编辑结束
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; //进行编辑 文字修改
- (BOOL)textFieldShouldReturn:(UITextField *)textField; //返回
触发顺序:
进行修改 之后点键盘返回键
开始编辑__________________________________>返回 --------------》编辑结束
|
|
| 不进行修改 直接点屏幕
|-----------------------------------------------------》编辑结束
UITextField触发的时候,触屏事件能传递给它所在的CCLayer (点击UITextField弹出键盘时和键盘开启状态下点屏幕)',触发ccLayer的触屏函数
[textFieldbecomeFirstResponder]; //开启键盘
-(BOOL)textFieldShouldReturn:(UITextField *)textField{
[textFieldresignFirstResponder]; //关闭键盘
returnYES;
}
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
//返回一个BOOL值,指定是否循序文本字段开始编辑
return YES;
}
- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
//当用户使用自动更正功能,把输入的文字修改为推荐的文字时,就会调用这个方法。
//这对于想要加入撤销选项的应用程序特别有用
//可以跟踪字段内所做的最后一次修改,也可以对所有编辑做日志记录,用作审计用途。
//要防止文字被改变可以返回NO
//这个方法的参数中有一个NSRange对象,指明了被改变文字的位置,建议修改的文本也在其中
return YES;
}
关于封装CCEditBox之后使用的问题:
封装CCEditBox,实现一个新的TextField,让原本的CCeditBox作为TextField的子节点存在。
坐标问题:
使用TextField,在cocos2dx上面设置TextField坐标后,发现TextField坐标正确,作为子节点的CCEditBox在屏幕上的坐标是(0,0),但是 CCEditBox的背景CCScaleSprite的坐标正确。
交叉编译到android,CCEditBox的输入框和它的背景sprite坐标都正确。
TextField所在层的触控优先级问题:
cocos2dx上,对TextField所在层设置单点触控,优先级设置为0,没有问题。
在android上,对TextField所在层设置单点触控,优先级为0,点击输入框,没有响应。
解决方法:单点触控时设置层的优先级大于0(CCEditBox默认优先级为0),或者设置多点触控。
CCEDitBox所在的层设置隐藏,exitBox仍可以相应的问题
CCEditBox设置隐藏无效,他所在的层隐藏时候,editbox还能相应,可以将它坐标设置在屏幕外面,或者删除。
)void CCEditBox::setPosition(const CCPoint& pos)
{
CCControlButton::setPosition(pos);
if (m_pEditBoxImpl != NULL)
{
m_pEditBoxImpl->setPosition(pos);
}
}
voidCCEditBox::setPosition(constCCPoint& pos)
{
CCControlButton::setPosition(pos);
if (m_pEditBoxImpl !=NULL)
{
CCPoint worldPos = pos;
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
if(this->getParent()!=NULL &&this->getParent()->getParent()!=NULL)
{
worldPos =this->getParent()->convertToWorldSpace(pos);
}
#endif
m_pEditBoxImpl->setPosition(worldPos);
CCLog(" 输入框世界坐标pos(%f,%f)",worldPos.x,worldPos.y);
}
}
这样,CCEditBox作为不是全屏控件的子节点时,编辑框和controllButton坐标重合。