上次说到CCScrollView里面添加CCMenu可以解决触摸优先级的问题,但实际上还有问题,滑动是可以滑动了,但滑动一松手,它可能立马响应CCMenu的点击事件,还有,当CCMenu超出可视区域后还是能够点击,这也是让人头疼的问题。问题虽然让人头疼,但解决方案还是有的。我们还是从上篇的CCMenu的扩展类MyMenu入手,我给MyMenu添加moved属性,初始化为false,在ccTouchMove事件里赋值为true,最后在ccTouchEnd里面判断是否move,如果move就不调用CCMenu的ccTouchEnd。这里要注意两点,一是每次ccTouchBegan的时候都要将move设为false,还有ccTouchEnd里面当move为true时,继承CCMenu的属性m_eState要设为kCCMenuStateWaiting,否则它就会在ccTouchBegan的时候return false而进不到ccTouchEnd中了。具体代码:
1 bool MyMenu::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent){ 2 if(visibleRect_.size.width&&visibleRect_.size.height){ 3 if(!visibleRect_.containsPoint(pTouch->getLocation())) 4 return false; 5 } 6 startPosition = pTouch->getLocation(); 7 return CCMenu::ccTouchBegan(pTouch,pEvent); 8 } 9 10 void MyMenu::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent){ 12 CCMenu::ccTouchMoved(pTouch,pEvent);13 }14 15 void MyMenu::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent){16 CCPoint position = pTouch->getLocation(); if(position.y - startPosition.y <= 10 && position.y - startPosition.y >= -10) 17 CCMenu::ccTouchEnded(pTouch,pEvent);18 else19 m_eState = kCCMenuStateWaiting;20 }
大家发现ccTouchBegan里面多了visibleRect_几行代码,这个就是用来判断CCMenu是否在可视区域,当不在可视区域直接return false,这样在超出可视区域点击CCMenu是无效的。当然这个可视区域是具体使用的地方传入的,其实也就是scrollView的viewSize。好啦,至此关于CCScrollView中添加CCMenu造成的一系列问题都得以解决。(在不断的尝试中总结经验,以帮助后面的人更快的上路,)