真的要哭出来了,太冷漠了。
解决了跟大家分享一下啊
秘诀:自己做一个软键盘,别用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