引擎版本: 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的私有方法,風險更高
但是方法一更直觀,沒有那么多異步的寫法,
方法一的用法沒有問題,只是語義不合法,而且是引擎不想讓你知道的方法.
寫法很多種, 自己選擇.