现在是动态创建一个prefab 往指定的node里面 加入一些子node ,然后让这个prefab显示出来.
在onEnable, start这俩方法里面 打印出node.size还是 prefab的初始size, 只有延迟一帧打印 size才会变成真实size.
layout 和widget的布局什么时候开始生效呢, 如果不能知道实际size, 就没法 把prefab放到平面内正确的位置
layout 和 widget 都是在 before_visit 之前生效的(Widget 在 layout 之前处理完布局)。你如果要在第一帧取到正确的 size,可以用 cc.director.on(cc.Director.EVENT_BEFORE_VISIT, your-callback);
来注册一个 before visit 事件。
引擎里面事件执行的顺序是: onLoad -> onEnable -> start -> update -> lateUpdate->before_visit(需要用 cc.director.on 来注册) -> after_visit(需要用 cc.director.on 来注册) -> after_draw (需要用 cc.director.on 来注册)
可以用 widget.updateAlignment() 来立刻强制更新一次布局。
看这段代码
onTouchStart_: function(event){
if(!this.informationUi_){
this.informationUi_ = cc.instantiate(this.uiPrefab);
this.informationUi_.parent = cc.Canvas.instance.node;
// 通知接口初始化ui
var event = new cc.EventCustom();
event.setUserData(this.informationUi_);
cc.Component.EventHandler.emitEvents(this.initDelegates, event);
}
cc.director.on(cc.Director.EVENT_BEFORE_VISIT, this.adaptScreen_, this);
this.informationUi_.active= true;
if(!this.informationUi_.parent){
}
this.informationUi_.zIndex = kdui.ZOrder.FLOAT_INFO;
event.stopPropagation();
},
我现在 注册了before_visit事件 但是在adaptScreen_里面 发现node.size还是初始大小, 说明layout布局并没有生效,initDelegates是用于初始化uiNode的回调
单纯的调用这个方法 有点麻烦,我要遍历一遍所有widget组件 然后挨个执行以下widget.updateAlignment()吗
这个方法仅更新 widget,对 layout 没有影响。我也没看出你的代码哪里用到 widget 了。
能否弄个小 demo,我看看什么情况。
重现方式 就是
- 注册一个touchStart 方法, 在里面var node = cc.instantiate(prefab)
- 加入几个子node,
- node.parent = cc.Canvas.instance.node; 加入场景中显示
- 注册一个事件 cc.director.on(cc.Director.EVENT_BEFORE_VISIT, this.adaptScreen_, this); 在adaptScreent里打印一下node.size 看是不是真实的size
挖坟一下,layout,里面添加子节点后,size没有立即刷新,可以获取到这layout,然后
使用updateLayout(),方法立即刷新。
const layout = this.itemList.getComponent(cc.Layout)
layout.updateLayout();