两个问题

  1. 要实现用一个透明的UIPanel暂时禁止用户触摸, 但是发现只对调用addChild增加该UIPanel之前的Widget生效,对以后调用addChild增加的其他UI不生效, 无论怎样设置ZOrder都不行。

  2. 使用UISlider会产生内存泄漏。

楼主您好,希望你能将第一个问题描述清楚,我们对于您的第一个问题比较模糊,不能了解您的需求。
第二个问题建议您贴出代码段。

版主您好,非常感谢您的回复。

首先,我使用的版本是Cocos2d-x V2.2.1, CocoStudio V1.1.0

第一个问题,使用CocoStudio创建一个UI,此UI上有一个透明的全屏UIPanel , 设计时把此UIPanel的交互打上勾,在程序中装载此UI后调用该UIPanel的setEnabled(true), 这样就能阻止用户点击UI上的其他Widget,然后,调用addChild在UI上添加另外一个UI, 此时无论怎样设置ZOrder都不能使前面的UIPanel遮蔽新的UI。
另外,昨天发现使用addChild, removeFromParent反复加载和去除同一个含有一半透明UIPanel的UI时(该UI封装在一个UILayer的子类中,装载后调用retain, 这样调用removeFromParent及addChild都是操作同一个实例),透明度会越来越小,直至完全不透明。

第二个问题,使用CocoStudio创建一个简单的UI, 该UI上放置一个UISlider, 在程序中加载此UI,然后关闭它,此时会出现内存泄漏。使用其他Widget不会出现这种情况。
代码如下:

class SellPropertyLayer : public UILayer
{
public:

virtual void onEnter();
virtual void onExit();

protected:
Layout * m_pLayout;

};

SellPropertyLayer::SellPropertyLayer()
: m_pLayout(NULL)
, m_pParent( NULL )
, m_nSellCount( 1 )
, m_strSellCountFormater( “” )
, m_pSlider( NULL )
{

}

SellPropertyLayer::~SellPropertyLayer()
{

}

void SellPropertyLayer::onEnter()
{
UILayer::onEnter();

scheduleUpdate();

// register root from json
m_pLayout = dynamic_cast<Layout*>(GUIReader::shareReader()->widgetFromJsonFile("SellPropertyLayer/SellPropertyLayer.ExportJson"));
m_pLayout->setTouchEnable( true );
this->addWidget(m_pLayout);

UIButton* pBtnClose = static_cast<UIButton*>(this->getWidgetByName(BTN_NAME_CLOSE));
if( !pBtnClose ) {
    CCLOG( "%s not found.", BTN_NAME_CLOSE );
}
pBtnClose->addTouchEventListener(this, toucheventselector(SellPropertyLayer::btnCloseCallback));

m_pSlider = static_cast<UISlider*>(this->getWidgetByName( "SliderSellCount" ));
if( !m_pSlider ) {
    CCLOG( "SliderSellCount not found." );
}
m_pSlider->addPercentChangedEvent( this, coco_pushselector( SellPropertyLayer::sliderPercentCallback ) );
if( m_tPropertyItemInfo.nCount == 1 ) {
    m_pSlider->setPercent( 100 );
}

}

void SellPropertyLayer::onExit()
{
SceneReader::sharedSceneReader()->purgeSceneReader();
GUIReader::purgeGUIReader();
cocos2d::extension::ActionManager::shareManager()->purgeActionManager();
UILayer::onExit();
}

void SellPropertyLayer::SetParent( CCScene * pParent )
{
m_pParent = dynamic_cast< MainScene * >( pParent );
}

SellPropertyLayer* SellPropertyLayer::create(CCScene * pParent, InformationLayer * pInfoLayer, tagPropertyItemInfo tPropertyItemInfo )
{
SellPropertyLayer *pRet = new SellPropertyLayer();
if (pRet && pRet->init())
{
pRet->autorelease();
pRet->SetParent( pParent );
pRet->m_pInfoLayer = pInfoLayer;
pRet->m_tPropertyItemInfo = tPropertyItemInfo;
return pRet;
}
else
{
CC_SAFE_DELETE(pRet);
return NULL;
}
}

void SellPropertyLayer::btnCloseCallback(CCObject* pSender, TouchEventType type)
{
if (type == TOUCH_EVENT_ENDED)
{
GameModel::sharedGameModel()->PlayButtonSound();
m_pParent->DismissDialog();
}
}

内存泄漏日志如下:
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 173272 at 0x059CDBC0: 16 bytes ----------
Call Stack:
c:\users\dick\documents\projects\cocos2d-x-2.2.1\extensions\cocostudio\json\cscontentjsondictionary.cpp (161): zjh.exe!cs::CSJsonDictionary::getSubDictionary + 0x7 bytes
c:\users\dick\documents\projects\cocos2d-x-2.2.1\extensions\cocostudio\json\dictionaryhelper.cpp (188): zjh.exe!cocos2d::extension::DictionaryHelper::getSubDictionary_json
c:\users\dick\documents\projects\cocos2d-x-2.2.1\extensions\cocostudio\reader\guireader.cpp (1774): zjh.exe!cocos2d::extension::WidgetPropertiesReader0300::setPropsForSliderFromJsonDictionary + 0x11 bytes
c:\users\dick\documents\projects\cocos2d-x-2.2.1\extensions\cocostudio\reader\guireader.cpp (999): zjh.exe!cocos2d::extension::WidgetPropertiesReader0300::widgetFromJsonDictionary + 0x17 bytes
c:\users\dick\documents\projects\cocos2d-x-2.2.1\extensions\cocostudio\reader\guireader.cpp (1026): zjh.exe!cocos2d::extension::WidgetPropertiesReader0300::widgetFromJsonDictionary + 0x13 bytes
c:\users\dick\documents\projects\cocos2d-x-2.2.1\extensions\cocostudio\reader\guireader.cpp (1026): zjh.exe!cocos2d::extension::WidgetPropertiesReader0300::widgetFromJsonDictionary + 0x13 bytes
c:\users\dick\documents\projects\cocos2d-x-2.2.1\extensions\cocostudio\reader\guireader.cpp (1026): zjh.exe!cocos2d::extension::WidgetPropertiesReader0300::widgetFromJsonDictionary + 0x13 bytes
c:\users\dick\documents\projects\cocos2d-x-2.2.1\extensions\cocostudio\reader\guireader.cpp (1026): zjh.exe!cocos2d::extension::WidgetPropertiesReader0300::widgetFromJsonDictionary + 0x13 bytes
c:\users\dick\documents\projects\cocos2d-x-2.2.1\extensions\cocostudio\reader\guireader.cpp (914): zjh.exe!cocos2d::extension::WidgetPropertiesReader0300::createWidget + 0x16 bytes
c:\users\dick\documents\projects\cocos2d-x-2.2.1\extensions\cocostudio\reader\guireader.cpp (153): zjh.exe!cocos2d::extension::GUIReader::widgetFromJsonFile + 0x29 bytes
c:\users\dick\documents\projects\cocos2d-x-2.2.1\projects\zjh\classes\sellpropertylayer.cpp (25): zjh.exe!SellPropertyLayer::onEnter + 0x1D bytes
c:\users\dick\documents\projects\cocos2d-x-2.2.1\cocos2dx\base_nodes\ccnode.cpp (614): libcocos2d.dll!cocos2d::CCNode::addChild + 0x12 bytes
c:\users\dick\documents\projects\cocos2d-x-2.2.1\projects\zjh\classes\mainscene.cpp (280): zjh.exe!MainScene::ShowSellPropertyLayer + 0x20 bytes