cocos creator 3.8.1 win10
过程:
我用两个预制件(cnLabel, enLabel)做了多个按钮,
预制件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中没有成功
就想到用上面的方式,但是预制件生成之后,取值不对
没有回复,自己顶一顶
看看代码
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赞
感谢赐教!