天天看點

CocosCreator Toggle的不可點選沒有變成Disabled下的spriteframe

我的Creator版本是v2.2.2

Toggle是繼承Button元件的,是以問題從Button裡面找,一頓操作過後發現是Button裡的_sprite屬性為null,而_sprite是在下面這個函數設定的

_applyTarget () {
        let target = this._getTarget();
        this._sprite = this._getTargetSprite(target);
        if (!this._originalScale) {
            this._originalScale = cc.Vec2.ZERO;
        }
        this._originalScale.x = target.scaleX;
        this._originalScale.y = target.scaleY;

        this._registerTargetEvent(target);
    },
           

那這個函數會在哪裡執行呢?

/**
         * !#en
         * Transition target.
         * When Button state changed:
         *  If Transition type is Button.Transition.NONE, Button will do nothing
         *  If Transition type is Button.Transition.COLOR, Button will change target's color
         *  If Transition type is Button.Transition.SPRITE, Button will change target Sprite's sprite
         * !#zh
         * 需要過渡的目标。
         * 目前按鈕狀态改變規則:
         * -如果 Transition type 選擇 Button.Transition.NONE,按鈕不做任何過渡。
         * -如果 Transition type 選擇 Button.Transition.COLOR,按鈕會對目标顔色進行顔色之間的過渡。
         * -如果 Transition type 選擇 Button.Transition.Sprite,按鈕會對目标 Sprite 進行 Sprite 之間的過渡。
         * @property {Node} target
         */
        target: {
            default: null,
            type: cc.Node,
            tooltip: CC_DEV && "i18n:COMPONENT.button.target",
            notify (oldValue) {
                this._applyTarget();
                if (oldValue && this.target !== oldValue) {
                    this._unregisterTargetEvent(oldValue);
                }
            }
        },
           
__preload () {
        this._applyTarget();
        this._resetState();
    },
           

那按理來說,這個函數是肯定會被執行的,又一頓操作發現,我設定interactable的時候居然在_applyTarget之前就執行了更新spriteframe的函數。

是以要怎麼解決呢?其實很簡單也很sb,看下面

//tabItem是包含cc.Toggle元件的一個節點
	let node = cc.instantiate(tabItem);
	node.parent = toggleContainer.node; // 先将node添加到某個節點上,就會先執行__preload
    node.getComponent(cc.Toggle).interactable = data.enabled;
           

如果是下面的寫法,就會出現spriteframe沒有更新的問題

//tabItem是包含cc.Toggle元件的一個節點
	let node = cc.instantiate(tabItem);
    node.getComponent(cc.Toggle).interactable = data.enabled; // 先更新了spriteframe,但是_sprite為空,是以更新了個寂寞
	node.parent = toggleContainer.node;
           

繼續閱讀