如何屏蔽UILayer下层的touch事件?

我用cocostudio做了一个提示框层,touch事件使用addTouchEventListener来监听的,加载后想屏蔽底层sence的touch事件,该怎么做?不用ccTouchBegan,还有没有其他方法?

外面不是有:【 每日·槽】第2话 – 模态窗口的制作 嘛,就在你这个帖子下面,还加亮显示了你怎么就看不到好桑心 :6::6::6:
http://www.cocoachina.com/bbs/read.php?tid=181959

:12: 多谢啦,昨天有看到这个帖子,是我理解错了,一直设置layer的setsize属性,结果死活找不到,今早在仔细一看才发现问题…

:877::877::877:

setToucheEnabled只能是单个控件有效

如果是GUIReader:shareReader():widgetFromJsonFile() 取出的widget 包含很多child
那么设置widget:setTouchEnabled(false)无法对child生效 还是可以点击
求指导如何破

写个函数,参数为你想禁用的控件,遍历该控件所有子结点,挨个设置setTouchEnabled(false)。
参考 void Widget::setEnabled(bool enabled) 的写法。

这里面也有类似的方法:http://www.cocoachina.com/bbs/read.php?tid=193993


Layout* button_layout = static_cast <Layout *>(m_pUILayer->getWidgetByName("button_Panel"));
CCObject* obj = NULL;
CCARRAY_FOREACH (button_layout->getChildren(), obj)
{
    Button* build_button = static_cast< Button*>(obj); 
    build_button->setTouchEnabled(false);
}

这个办法我想过
可是 对于子节点 有的是可点 有的不能点

如果设置全部子节点为false
那我恢复的时候 全部为true
岂不是不能点的控件也被启用了

高级粉,上次我给你说的就是楼上说的这个问题~~~有木有好方案啊?

这个只能是你自己写逻辑判断了吧,得根据自己的需求管理呀。

:9: 算了···越弄越麻烦,还是直接遮罩方便些。

:6::6::6:
这是个很常见的需求啊
每个被模态窗口遮住的地方如果都要写一大段代码屏蔽touch…悲剧啊:6::6:
hanrea大大给反应一下这个需求啊

【 每日·槽】第2话 – 模态窗口的制作 http://www.cocoachina.com/bbs/read.php?tid=181959
我这里面的方法不可以吗? 把弹出的窗口的的大小用setSize设置为屏幕的大小,不就挡住后面的控件了?就不用挨个屏蔽touch事件了啊。

肯定是挡住了还响应事件我才问的啦…:12::12:

遮罩是在 TouchRroup里面加一个CCLayer 吗
怎么阻断事件呢

不会吧,我就是这么做的啊。
不加CCLayer,我的提示框是单独的一个画布,把这个画布大小设置为屏幕大小,然后Zorder 大于其他层

恩,目前2.x版本因为底层事件分发的问题,且后面会转向3.0了~~2.x应该不会有大改动了,如果无法升级可以根据自己的情况来修改。

还有个办法,不过得改引擎代码。现在 setEnable 函数还控制着控件是否显示,只要让 setEnable 不管控件显示,只管是否可以点击就可以。

void Widget::visit()
{
if (_enabled)
{
Node::visit();
}
}

void Layout::visit()
{
if (!_enabled)
{
return;
}

}
这两个函数里去掉 if (_enabled) 判断

这个时候如果你想连带所有子控件一起禁用就用setEnable(false);
禁用单个控件就用setTouchEnabled(false);

比如,A有1、2、3 三个控件
先禁用2:2. setTouchEnabled(false);
然后禁用A中所有控件: A.setEnable(false)
这个时候都不可以点击了
然后开启A中所有控件:A.setEnable(true)
这个时候2还是不可以点击,其他都可以点击了。

我用的是 cocos2d-x 3.0 beta1
其他版本没测试过

我的模态窗口是一个getWidgetFromJosnFile()拿到的UI

把他放到TouchGroup里

TouchGroup最下面一层是游戏界面
模态窗口完全盖上去