码迷,mamicode.com
首页 > 其他好文 > 详细

Cocos Creator Label 设置文本后立即获取高度

时间:2020-07-21 14:02:57      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:one   赋值   导致   语义   相关   block   设置   延时   enable   

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

写法很多种, 自己选择.

Cocos Creator Label 设置文本后立即获取高度

标签:one   赋值   导致   语义   相关   block   设置   延时   enable   

原文地址:https://www.cnblogs.com/vkerL/p/13354343.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!