在開發中常常要根據改變按鈕等控件的顯示狀態和觸摸事件,有兩種方法一種是 1.setEnabled() 2.setVisible() 和 setTouchEnabled() 最初只是認爲setEnabled = setTouchEnabled()和setVisible(). 有時候在底層設置了經過設置setEnabled(false) 隱藏了控件並不可觸摸,但有時仍是沒有生效。 UIWidget代碼以下:code
void Widget::setEnabled(bool enabled) { _enabled = enabled; if(_widgetChildren && _widgetChildren->count() > 0) { CCObject* child; CCARRAY_FOREACH(_widgetChildren, child) { ((Widget*)child)->setEnabled(enabled); } } }
實際上已經生效,只是若是父節點設置了setEnabled(true),則會遍歷全部子節點並設置設置_enable = true,因此無效。事件
此外還有個問題,就是有時候經過setEnabled(false)隱藏控件,要顯示時調用setVisible(true) 和 setTouchEnabled(true)確無效。ip
void Widget::visit() { if (_enabled) { CCNode::visit(); } }
控件的顯示是經過visit來繪製的,若是_enabled == false 則不去繪製。就沒法顯示。 至於觸摸事件:開發
Widget::Widget(): _enabled(true), _bright(true), _touchEnabled(false), ... bool Widget::onTouchBegan(CCTouch *touch, CCEvent *unused_event) { _hitted = false; if (isEnabled() && isTouchEnabled()) { _touchStartPos = touch->getLocation(); if(hitTest(_touchStartPos) && clippingParentAreaContainPoint(_touchStartPos)) { _hitted = true; } } ... }
在begin中作了enable和_touchEnabled的與的判斷。 因此若是是setEnabled()禁止了觸摸事件,要恢復仍是要經過setEnable().get
綜上:若是要設置子空間控件的隱藏和顯示,推薦使用setVisible()和setTouchEnabled().it