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的私有方法,风险更高
但是方法一更直观,没有那么多异步的写法,
方法一的用法没有问题,只是语义不合法,而且是引擎不想让你知道的方法.
写法很多种, 自己选择.