[cocos2d]如何实现模态对话框

问题描述:
     在显示一些类似于模态对话框的窗口时,我们可能需要屏蔽touch事件,不让在弹出框下面的界面响应touch事件。

     而弹出框上某些区域,或者按钮可以响应touch事件。

解决方案:

      1> 给弹出框添加带吞噬能力的touch代理功能。

[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:kCCMenuTouchPriority + 1 swallowsTouches:YES];

     

注意:
     a>:代理是会被retain的。所以使用完后务必要移出。
[[CCTouchDispatcher sharedDispatcher] removeDelegate:self];
     b>:priority其值越小,越是会优先响应touch事件。
               这里使用kCCMenuTouchPriority + 1 既该界面的响应优先级比菜单按钮优先级低。如果你希望又最高的优先级最好使用INT32_MIN+1

     2> 实现代理方法ccTouchBegan:返回YES表示吞噬touch事件,则其他代理都不收到该事件了。
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    /**override to what you like*/
    return YES;
}
     如果需要在某个区域内可以响应touch事件,则可以添加如下代码
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
     CGRect aRect = CGRectMake(50, 50, 50, 50);
    CGPoint touchpoint = [touch locationInView:[touch view]];
    touchpoint = [[CCDirectorsharedDirector] convertToGL: touchpoint];
    return !CGRectContainsPoint(aRect, touchpoint);
}
     如果你希望除了菜单按钮以外的区域都不响应touch事件你也可以这样写:
  - (BOOL)ccTouchBegan:(UITouch *)touch 
  withEvent:(UIEvent *)event
{
CCMenu *menu = 
(CCMenu *)[selfgetChildByTag:kMenuItemLayerTag];
if ([menu itemForTouch:touch])
{
returnNO;
}
    
returnYES;
}
     注意:其中itemForTouch:方法的使用有点技巧,提示这个方法是ccmenu的私有方法

     当然除了使用这种暴力方式以外,也可以用优先级来实现,如上面提到的priority:kCCMenuTouchPriority + 1。这种方式就需要大家能良好的执行约定。同时用优先级来控制有个问题,如果与下层的按钮重叠的时候,是那个执行那?

时间: 2022-10-25

[cocos2d]如何实现模态对话框的相关文章

showModalDialog模态对话框的使用详解以及浏览器兼容

showModalDialog是jswindow对象的一个方法,和window.open一样都是打开一个新的页面.区别是:showModalDialog打开子窗口后,父窗口就不能获取焦点了(也就是无法操作了) 1.ModalDialog是什么? showModalDialog是jswindow对象的一个方法,和window.open一样都是打开一个新的页面. 区别是:showModalDialog打开子窗口后,父窗口就不能获取焦点了(也就是无法操作了). 可以在子窗口中通过设置window.re

JS模态对话框showModalDialog用法

 本篇文章主要是对JS对话框_JS模态对话框showModalDialog的用法进行了总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 父窗口:   代码如下: <html> <head> <title>无标题页</title> <script language="javascript" type="text/javascript"> function opendialog1()  {  var so

showModalDialog模态对话框的使用详解以及浏览器兼容_javascript技巧

1.ModalDialog是什么?showModalDialog是jswindow对象的一个方法,和window.open一样都是打开一个新的页面.区别是:showModalDialog打开子窗口后,父窗口就不能获取焦点了(也就是无法操作了).可以在子窗口中通过设置window.returnValue的值,让父窗口可以获取这个returnvalue. 2.一个例子1)主窗口main.html,2)在主窗口中通过showModalDialog的方式打开子窗口sub.html3)在子窗口中设置ret

JS对话框_JS模态对话框showModalDialog用法总结_javascript技巧

父窗口: 复制代码 代码如下: <html><head><title>无标题页</title><script language="javascript" type="text/javascript">function opendialog1() { var someValue=window.showModalDialog("b.html","","dialo

[译]安卓界面导航初识

本文讲的是[译]安卓界面导航初识, 原文地址:A Primer on Android navigation 原文作者:Liam Spradlin 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:horizon13th 校对者:SumiMakito, laiyun90 安卓界面导航初识 界面中任何引领用户跳转于页面之间的媒介 -- 这便是导航 当你的应用中的两个不同页面产生联系时,导航便由此而生.跳转链接(不论从哪跳到哪)便是页面间传递用户的媒介.创建导

一张图看懂阿里云网络产品[五]负载均衡SLB

负载均衡SLB是对多台云服务器进行流量分发的服务.它可以通过流量分发扩展应用系统的服务能力,通过消除单点故障提升应用系统的可用性.通过设置虚拟IP,将位于同一地域的多台云服务器虚拟成一个高性能.高可用的应用服务池.根据指定的方式,将来自客户端的网络请求分发到云服务器池中. 系列文章持续更新中,敬请关注 [一]网络产品概览 [二]VPC [三]EIP [四]NAT网关 [五]负载均衡SLB [六]共享带宽 [七]共享流量包 [八]高速通道 [九]VPN网关 [十]云托付 [十一]全球加速

一张图看懂阿里云网络产品[七]共享流量包

共享流量包是BGP公网流量的预付费套餐,价格比后付费流量更低,并支持闲时峰谷流量包,能大大降低用户的BGP公网流量成本,是企业必备的省钱利器.本图将为各位全面讲解共享流量包产品. 系列文章持续更新中,敬请关注 [一]网络产品概览 [二]VPC [三]EIP [四]NAT网关 [五]负载均衡SLB [六]共享带宽 [七]共享流量包 [八]高速通道 [九]VPN网关 [十]云托付 [十一]全球加速

一张图看懂阿里云网络产品[六]共享带宽

系列文章持续更新中,敬请关注 [一]网络产品概览 [二]VPC [三]EIP [四]NAT网关 [五]负载均衡SLB [六]共享带宽 [七]共享流量包 [八]高速通道 [九]VPN网关 [十]云托付 [十一]全球加速

你画我猜-Qt 制作状态栏,不受模态对话框的影响。

问题描述 Qt 制作状态栏,不受模态对话框的影响. 我制作了一个置顶的类似于Windows任务栏的对话框,主要用来显示主程序的网络连接和输入法切换等信息. 但是当主程序弹出其他的对话框的时候,导致任务栏无法操作,获取不了焦点.我怎么做到这个状态栏置顶并且不会受主程序弹出的模态对话框的影响,也就是模态对话框只对主程序有影响,而不会影响我的任务状态栏. 解决方案 把任务栏的父窗口设置为桌面窗口GetDeskTopWindow()