[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。這種方式就需要大家能良好的執行約定。同時用優先級來控製有個問題,如果與下層的按鈕重疊的時候,是那個執行那?
最後更新:2017-04-02 22:16:28
上一篇:
iPhone開發中的多語言化
下一篇:
用ActivityGroup解決TabHost中多個Activity跳轉問題
顛覆大數據分析之第二章結束語
Coursera Scala 5-5 List:Reduction of Lists
DBA入門之路:察微知漸細致入微
三種方式實現自定義圓形頁麵加載中效果的進度條
深層解讀:等保2.0 你準備好了嗎?
Android 遊戲開發中 OnTouchEvent() 觸屏事件的性能優化
我眼中的海爾:一個掀起物聯網風暴的有機生命體
CodeIgniter框架模型(model),視圖(view)和控製器(controller)中的文件操作
Using XtraBackup for Physical Backup and Restoration
【轉載】win7+ubuntu 下ubuntu卸載方法