label string 设置内容后,获取不了width

Creator 版本 2.1

    this.label.string = "11111113241234124";
   //  this.label._updateRenderData(true);
    cc.log("start self.label.width:" + this.label.width)
    cc.log("start self.label.string:" + this.label.string)

不使用 _updateRenderData 函数,获取 width = 0
如果使用 _updateRenderData 函数,提示 没有 这个 this.label._updateRenderData is not a function, 不是函数

改成 this.label._updateRenderData = true;
不报错,但是 width 也是 0 。

请问,更新 string 后,怎么获取width呢 ?

应该访问 this.label.node.width

    this.label.string = "11111113241234124";
    //this.label._updateRenderData(true);
    cc.log("start self.label.width:" + this.label.width)
    cc.log("start self.label.string:" + this.label.string)
    cc.log(this.label.node.width, this.label.node.height);
    cc.log("start self.label.node.width:" + this.label.node.width)

报错:

Cannot read property ‘width’ of undefined,

是在 start 函数添加的代码

start() {

    this.label.string = "11111113241234124";
    //this.label._updateRenderData(true);
    cc.log("start self.label.width:" + this.label.width)
    cc.log("start self.label.string:" + this.label.string)
    cc.log(this.label.node.width, this.label.node.height);
    cc.log("start self.label.node.width:" + this.label.node.width)

    cc.log("rollnotice start! ++++++++++++++++");  
    this.noticePlay("我是一个测试条");
},
properties: {
    mask: {
        default: null,
        type: cc.Node,
        displayName: '遮罩'
    },

    label: {
        default: null,
        type: cc.Node,
        displayName: '文本'
    },

    text: {
        default: [],
        type: [cc.String],
    }
},

我 的 label 就是 node 类型的

如果是node类型的话,这样用:
this.label.getComponent(cc.Label)._updateRenderData(true);
console.log(this.label.width);

start() {

    this.label.getComponent(cc.Label).string = "11111113241234124";
    this.label.getComponent(cc.Label)._updateRenderData(true);
    cc.log("start self.label.width:" + this.label.width)
    cc.log("start self.label.string:" + this.label.string)
    
    cc.log("rollnotice start! ++++++++++++++++");  
    this.noticePlay("我是一个测试条");
},

改成这样好了,谢了啊!
应该是没有理解了 Label 和 Node的 关系。

ts怎么办?ts找不到这个函数,强制通过编译后,运行报错没有这个函数:6:

是啊 ts不行啊 一直报错,兄弟你解决了吗

_forceUpdateRenderData(true)

更好的办法就是用scheduleOnce在下一帧获得宽度。

应该有一个立即刷新的方法吧

this.label.getComponent(cc.Label)["_forceUpdateRenderData"](true) 这么写 就是强制刷新。然后this.label.width就可以了(你这里this.label是 cc.Node类型)

1赞

对于 creator.d.ts 没有写的api, 不要用 点号调用 用 [“函数名”] 去调用就行了

1赞

3.4.x出现了,但是你们提供的方式都无法成功,只能设置延时来解决

hello,针对这个问题我试了下,使用 updateRenderData(true) 是可以正常获取更新后的 width 的,我的测试代码如下:

        let uiTrans = this.node.getComponent(UITransform);
        if (uiTrans && this.label) {
            console.log('width before:' + uiTrans.width);
            this.label.string = '12131231313123';
            this.label.updateRenderData(true);
            console.log('width after:' + uiTrans.width);
        }

请问你是怎么遇到问题的呢?

1赞

问题已经解决,感谢,之前以为删除了这个方法,结果发现getComponent返回的类型是any,难怪在label组件上面获取不到updatexxx方法

我这边给官方一个建议哈,我也是2年的c粉了,但是至今才知道this.label.updateRenderData(true)这个方式去刷新width(因为我才知道width原来不会这帧刷新),希望文档可以多多优化下

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。