閱讀67 返回首頁    go 阿裏雲 go 技術社區[雲棲]


[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

  上一篇:go iPhone開發中的多語言化
  下一篇:go 用ActivityGroup解決TabHost中多個Activity跳轉問題