layout和widget的布局什么时候才会生效?

现在是动态创建一个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 来注册)

1赞

可以用 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,我看看什么情况。

重现方式 就是

  1. 注册一个touchStart 方法, 在里面var node = cc.instantiate(prefab)
  2. 加入几个子node,
  3. node.parent = cc.Canvas.instance.node; 加入场景中显示
  4. 注册一个事件 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();