条件:当前版本quick-3.3 -lua,系统 win7。
问题:在输入框(textField或者editbox,下文“输入框”就代表这两种)打开的情况下弹出其他界面盖住输入框,点击上层界面的时候输入框还会优先响应点击事件,而上层的界面上的其他控件不会响应点击事件。
原因分析:界面上的点击事件使我们自己定义的touch事件,而输入框点击事件是在cpp层quick接受处理的,所以导致我们拦截点击事件也不好处理。
处理方案一:更改Cpp层做成统一的事件监听可以按照层级来顺序监听。
处理方案二:脚本层处理,重新封装UIInput对象使得满足事件监听顺序。
由于老大不让我改引擎代码,让我想办法脚本层处理这个问题。于是我从方案2入手的。
已知输入框是可以通过setTouchEnabled函数屏蔽点击事件的,
于是思路如下,UIInput本来返回一个输入框类型的对象,要满足点击顺序必须使用与lua层点击事件一样的事件处理。因此我需要返回一个可以重写touch事件的界面就Node吧,
先对输入框setTouchEnabled函数上锁,然后通过touch事件来处理来决定是否向下传递点击事件,这个时候需要一个输入框点击函数touchDownAction,往下传递点击事件,传递完毕立即加锁。
点击事件代码如下:
local oTouchNode = display.newNode()
oTouchNode:setContentSize(oSize)
editbox:addTo(oTouchNode)
editbox:setTouchEnabled(false) --输入框加锁
oTouchNode:setTouchEnabled(true)
oTouchNode.editBox = editbox--本来是要返回editbox对象的,现在返回的是oTouchNode
oTouchNode:addNodeEventListener(cc.NODE_TOUCH_EVENT, function(event)
if "ended" == event.name then
--这里可以建判断点击事件是否还在控件中
editbox:setTouchEnabled(true) --解锁
editbox:touchDownAction(editbox, 2)--传递事件
editbox:setTouchEnabled(false) --加锁
end
return true
end)
return oTouchNode
这样会导致一个小问题是我们不能直接访问editbox的方法,为了兼容其他已经写到的地方我们可以把editbox的函数重定向到Node上
当然要搜一下 用到了哪些都加上才行。
就这么多吧,测试可行。第一种方案需引擎优化吧。