CCEditBox 使用问题

使用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在iOS模拟器和android手机上的使用问题

CCEDitBox在android和iOS上分别调用各自的平台控件实现。CCEditBox只能用于单行文本输入。
android上面使用没问题。
在iOS上存在这个问题:
CCEditBox在全屏坐标下没问题。他作为某个不是全屏控件的子控件时,作为是这种:
CCtrollButton坐标正确,编辑框的坐标在(0,0)。原因是编辑框使用全屏坐标,CCEditBox使用相对坐标,即相对于父节点的坐标。

关于封装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还能相应,可以将它坐标设置在屏幕外面,或者删除。

)


查看CCEditBox的坐标设置:

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坐标重合。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值