cocostudio的UI编辑器真是个好东西,用的熟真是可以节省很多开发时间,把客户端程序员从无尽的需求变化中解脱出来~
最近使用cocostudio的UI编辑器,遇到了一个问题,就是希望在场景当中注册Touch事件实现手势功能的同时,还能够使用cocostudio的UI编辑器导出的Layout等界面,
之前在做UI的过程当中,其实有一个属性很关键,就是那个标有“交互”属性的checkbox,打钩,不打钩,这个看似不重要,其实这就是今天我写这篇文章的”金钥匙“!
我的UI一般是做成全屏的,这样比较方便
场景中注册了onTouchBegan等事件后,自从添加了Layout的UI后,就再也无法响应场景的onTouchBegan了,很奇怪,最后看到了一篇文章:
传送门:
http://www.cocoachina.com/bbs/read.php?tid=197606
嘿嘿,自从把所有”交互“全部取消(除了按钮)以后,就正常了,场景的事件又可以响应了。
那这个”交互“选项内部,到底隐藏着怎样的秘密呢?
Layout* ui = xxxx;
ui->setTouchEnabled(true);
其实”交互“就是设置的是TouchEnabled()这个函数,如果为false,这个Layout就不会注册TouchListener,
事件向下传递,主要看的是onTouchBegan函数,是否返回false,如果返回true,则会被截断,这样后面的Widget或者Layer就无法接受事件了。
因此,如果一个UI打开了这个setTouchEnabled(true); 它的 onTouchBegan 就会返回true,把这个事件吃掉
具体原理,可以参看CCEventDispatcher.cpp
void EventDispatcher::dispatchTouchEvent(EventTouch* event)
{
}
其中有一段代码:
if (isClaimed && listener->_isRegistered && listener->_needSwallow) { if (isNeedsMutableSet) { mutableTouchesIter = mutableTouches.erase(mutableTouchesIter); isSwallowed = true; } return true; }这个 isClaimed变量其实就是onTouchBegan的返回值,该单词意思为认领,一旦这个Touch事件被某个接受者认领以后,就会在mutableTouches中将其删除,因此就不会继续传递下去了。