诡异的Widget

  • Creator 版本: 3.0

  • 目标平台:Chrome

  • 重现方式:
    遇到个widget 的BUG 特意记录一下 希望同遇的同伴可以交流一下
    1 场景元素使用widget布局
    2 使用tween移动
    3 在同一个parentNode下添加一个Node 该元素复位了
    4 删除widget后恢复正常
    5 就好像新增Node触发了resizeWindow一样 但是设置成once也没用

感觉你这设计就有问题吧?widget应该是表示一个相对静止的东西,但是这玩意又会移动

tween移动的东西,不要用widget吧。
你可以给你tween移动的东西加一个容器,给这个容器加widget。

1 现在在外面包一个node 用widget可以 外面的node定位 然后里面tween缓动可以
2 这个方案虽然可行 但是2.X时代完全可以widget定位然后tween缓动
否则always once onwindowResize有何用
3 而且 添加节点触发widget重新定位 这个也算正常? 看起来应该是新增node异常触发了widget定位有关

1赞

widget AlignMode 有once 和 onwindowResize 和always 2.x时代 使用once基本就是初始化调用一次 之后移动什么的都无所谓

没这么用过,感觉此处应该艾特下引擎组大佬

这个不是bug, 建议你参考下 widget组建的updateAlignment方法。

建议你在获取该节点坐标之前最好调用下updateAlignment 再去获取该节点坐标

没记错的话updateAlignment是立即调用widget的约束信息布局吧,通俗的说就是刷新
我的问题是我在node下添加一个字节点,这个node下的所以childnode都updatealignment了一遍
我的目的不是为了刷新,而是addchild的时候诡异的刷新了

你发个问题的demo吧。看下你的具体问题

1先点击左按钮 测试对象上移
2再点击右按钮 添加节点
3 新增节点使用widget布局的话会触发pNode下所有节点重新定位
4 2.x没有这个问题assets.zip (5.1 KB)

我也遇到了,也很奇怪。widget节点,点击btn。用tween移动节点,移动完毕后节点active设为false,然后此时在点击btn,把节点active设为true。此时节点居然触发了一次对齐操作,位置又回去了。widget模式是window_res那个属性。奥对了,我的是2.4.5

我没记错好像widget的updateAlignment方法会重置所有的widget吧,我个人觉得是挺坑的。但是2.x版本不会说新加的widget会导致其他widget复位,不知道是不是因为3.0官方直接套用了updateAlignment方法的缘故?

同样,我项目切2.x版本了,本来想用ccc3做的,写的闹腾人,莫名其妙的label不刷新,位置错乱

好像是这个 pr 修复的,你可以更新看看能不能解决,https://github.com/cocos-creator/engine/pull/8347

3.0.1 这个问题是有得到解决,如果不介意升级的话,但是还是请提前做个备份

我也遇到此类问题,不知楼主是否已经解决,有类似问题的朋友可以做一下参考,我的场景是一个遮罩层对话框弹窗

异常分析猜测

  1. tween操作在首次setScale的时候,同时widget也在对齐,widget对齐之后,tween操作依然在执行,然后触发to操作,放大scale,从而导致布局异常

解决

  1. 在tween的操作上使用 setTimeout 加一个合理的延时
  2. 确保widget设置了4个方向,我最初只设置了 left right top,没有设置bottom,步骤1并不能生效,设置4个方向后可以正常(原因未知)