Cocos Creator Label 設置文本后立即獲取高度


引擎版本: 2.3.3
引擎源碼版本: 2.4.2
引擎源碼hash值: fa81ab2cbac8190163656b2f1de0f8119f961909

我用看的是master分支.

在給文本賦值之后不會立即刷新文本內容,而是在下一幀進行渲染, 導致你不能立即獲取文本的高度,

解決問題的思路,

1.首先查看官方提供的api
2.沒有的話可以去論壇搜索一下相關問題
3.其次就是看一下引擎的源碼,

這里有兩種解決方案

1.直接調用 label 里面的私有方法 進行強行跟新渲染
2.延時 0.1秒 后在進行獲取文本的高度 和 后續邏輯處理

方法一

論壇上人說的方法在新版本中已經使用不了了.
看了一下引擎的源碼

截圖比較的麻煩我就不截圖了

源碼路徑: ~/core/components/CCLabel.js

onEnable () {
        this._super();

        // Keep track of Node size
        this.node.on(cc.Node.EventType.SIZE_CHANGED, this._nodeSizeChanged, this);
        this.node.on(cc.Node.EventType.ANCHOR_CHANGED, this.setVertsDirty, this);

        this._forceUpdateRenderData();
}

可以看到 onLoad 函數里面 直接調用了一個私有函數, 根據定義的函數名 翻譯過來就是 強行更新渲染數據.
所以在游戲源碼中可以這么寫

// 這里是ts寫法
// js 可以直接調用
let label = this.node.getChildeByName(cc.Label);
label.string = "123";
(<any>label)._forceUpdateRenderData();
// 處理后面邏輯
// ...

方法二

這個延時時間可以再縮短

let label = this.node.getChildeByName(cc.Label);
label.string = "123";

cc.tween(this.node).delay(.1).call(() =>{
      // 處理后面邏輯
      // ...
}).start();

方法二的更安全, 因為方法一直接調用了label的私有方法,風險更高
但是方法一更直觀,沒有那么多異步的寫法,
方法一的用法沒有問題,只是語義不合法,而且是引擎不想讓你知道的方法.

寫法很多種, 自己選擇.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM