【3.8.1bug】预制件实例化后label的contensize.width取值错误

cocos creator 3.8.1 win10
过程:
我用两个预制件(cnLabel, enLabel)做了多个按钮,1 2
预制件1中label.string随意敲了字符,Overflow为None,对应的contentsize的width是214
预制件2中label.string随意敲了字符,Overflow为None,对应的contentsize的width是707
结果:
对预制件instantiate之后,获取到的同类型的预制件的contentsize的width是只有214和707
这个取值不对啊
但是在编辑器模式,从属性面板查到的contentsize的width就是正确的。
个人觉得这是个bug吧,
或者是我的取值方式不对?

不是预制件生成的,取值就没有问题

我要做的是按钮随着文字大小变化的效果
论坛中7年前有用layout解决的,但在3.8.1中没有成功
就想到用上面的方式,但是预制件生成之后,取值不对

没有回复,自己顶一顶

看看代码 :thinking:

import { _decorator, Component, instantiate, Label, Node, Prefab, Sprite, UITransform } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('test')
export class test extends Component {
    // @property(Node)
    // parent: Node
    @property(Prefab)
    cn: Prefab
    @property(Prefab)
    en: Prefab
    @property(Node)
    l1: Node
    @property(Node)
    l2: Node
    @property(Node)
    l3: Node
    start() {
        this.showLabels()
        this.show_old()
    }
    showLabels() {
        let NodeX
        let labelX: any
        let en_arr = ['451@your P.E. teacher', '452@the next day', '448@your favorite subject', "450@It's boring", "449@It's fun", '453@for sure']
        let cn_arr = ['448@你最喜欢的科目', '450@太无聊了', '451@你的体育老师', '449@很有趣', '453@肯定的', '452@第二天']
        for (let i = 0; i < 12; i++) {
            console.log('i', i);
            if (i % 2 === 0) {
                //1、加入并设置英文语料节点
                NodeX = instantiate(this.en) as Node
                NodeX.parent = this.node
                //设置节点名称
                NodeX.name = i + 'en'
                //设置label内容
                labelX = NodeX.getChildByName('Label').getComponent(Label)
                labelX.string = en_arr[i / 2].substring(4)
            } else {
                //2、加入并设置中文语料节点
                NodeX = instantiate(this.cn) as Node
                NodeX.parent = this.node
                //设置节点名称
                NodeX.name = i + 'cn'
                //设置label内容
                labelX = NodeX.getChildByName('Label').getComponent(Label)
                labelX.string = cn_arr[(i - 1) / 2].substring(4)
            }
            let rgb = NodeX.getChildByName('rgb').getComponent(Label)
            let w: number = labelX.getComponent(UITransform).contentSize.width.toFixed(0)
            rgb.string = labelX.node.parent.name + '  ' + w
            console.log(`节点名${NodeX.name};contentSize.width=${w}`);
        }
    }
    show_old() {
        console.log('1:', this.l1.getComponent(UITransform).width);
        console.log('2:', this.l2.getComponent(UITransform).width);
        console.log('3:', this.l3.getComponent(UITransform).width);
    }
}

设置label.string后需要等下一帧尺寸才会刷新,如果需要立即获得新尺寸,先执行一下
label.updateRenderData(true)函数;

2赞

感谢赐教!