EditBox软键盘输入问题

真的要哭出来了,太冷漠了。

解决了跟大家分享一下啊

秘诀:自己做一个软键盘,别用editbox和系统自带的软键盘。
100元哈~

cocos 会监听键盘弹出和收起的事件对 view 做上下移动处理, 我猜测在 webview 中键盘收起的事件被 cocos 监听到了, 所以触发了 view 的 bug.

监听代码位于:

/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/cocos/platform/ios/CCEAGLView-ios.mm 的 onUIKeyboardNotification 函数, 你可以加个断点看是否进入了, 或者看日志中是否有: offestY = .

如果真的是这样的话, 解决方案就是让 cocos 不响应 webview 中的键盘收起事件. 比如可以在打开 webview 时设置一个变量, 关闭时重置这个变量, 然后在这段代码中处理下这个变量即可.

楼上正解

你这个回答也太。。。。。笼统了。。。

谢谢大佬,请发支付宝,如果解决了,会给你转账的

有什么方法可以在不改动底层来解决这个办法吗?项目已经上线的,这个改动热更新是不是修正不了?强制换包的话用户会流失很多的。。。

可以在打开webview时把这个 editbox 删除掉, 关闭 webview 时再加回来, 我不知道隐藏起来行不行, 你可以试一下.

隐藏和删除都不行,我试过了,只要游戏出现过editBox,就一直存在这个错误,除非进程结束重进

不知道是不是editbox建立了一个全局的事件监听。。。。

我看代码确实会在 Editbox 的 父类 IMEDelegate 释放时移除监听, 只有找到 delegate 才会在 keyboardWillHide 中移动屏幕:

IMEDelegate::~IMEDelegate()
{
    IMEDispatcher::sharedDispatcher()->removeDelegate(this);
}
void IMEDispatcher::dispatchKeyboardWillHide(IMEKeyboardNotificationInfo& info)
{
    if (_impl)
    {
        IMEDelegate * delegate = nullptr;
        DelegateIter last = _impl->_delegateList.end();
        for (DelegateIter first = _impl->_delegateList.begin(); first != last; ++first)
        {
            delegate = *(first);
            if (delegate)
            {
                delegate->keyboardWillHide(info);
            }
        }
    }
}

晚上有时间的话, 我看下你的 demo

我的理解:是在view下添加的监听,这个地方的监听应该是当弹出软键盘时显示的view大小会改变。而editbox的监听是当点击输入框内时,弹出软键盘,输入完成关闭软键盘,view大小再次改变。楼主如果理解了这个思路,再去查问题会好查一点吧。

嗯,谢谢。我完全不懂oc

嗯,谢谢啦

assets.zip (63.8 KB)

搞好了, 我试了下删除和隐藏确实都不行, 断点发现 Editbox 的析构函数并没有执行, 不知道是打算复用还是等 gc.

但是我给 editbox 设置了一个屏幕外的位置, 算出来的 offset 是 0, 屏幕就不会移动了, 监听 webview 的 back 再把 editbox 的位置设置回来就好了.

为了通用的话你可以把这个做成一个 Component, 挂在需要隐藏的 editbox 上面, webview 打开和关闭都发送一个事件, 这边监听下事件就行.

私信聊~

MARKMARKMARK

能留下qq吗?我加你

407574060 justbilt