Loading

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

写法很多种, 自己选择.

posted @ 2020-07-21 12:09  丫丫魏  阅读(1337)  评论(1编辑  收藏  举报