如何强制Godot重新计算控制节点size/position?

How to force Godot to recalculate control nodes size/position?

在 Godot 3.2.1 中构建 UI。当然,我使用锚点,因此 UI 元素会根据指定的布局自动排列在屏幕内。我有 UI 比例系统 - 没什么特别的 - 只需更改字体大小 (DynamicFont.size)。如果字体足够大,那么一些 UI 节点可能会被推出屏幕。但是,随着字体大小的减小,节点不会 return 变为正常的 sizes/positions。修复混乱的方法是调整游戏 window 的大小,这并不总是一个选项,而且似乎不是处理问题的正确方法。那么如何强制Godot重新计算控制节点size/position?

更改字体大小后将父控件的最小大小更改为 Vector2(0, 0) 可能会成功:

$Control.rect_min_size = Vector2(0, 0)

如果它已经设置为 Vector2(0, 0),您可能需要使用 call_deferred() 更改它两次才能生效。

在您的场景树中,找到包含您要重新计算的所有元素的顶级容器。在计算机科学术语中,这将是场景树中最低的共同祖先。现在,通过将 'visible' 属性 设置为 false 来隐藏容器。然后,添加延迟调用以将其 'visible' 属性 改回 true.

var your_container = $".".find_node("your-container")
your_container.visible = false
your_container.call_deferred("set_visible", true)

这似乎导致 Godot 重新计算 'your_container' 的布局。

看起来只有 CanvasItem 派生的 classes 有一个 'visible' 属性,所以你不能简单地设置 'visible' 属性例如,在 CanvasLayer 上。

幸运的是,容器和控件都派生自 CannvasItem,因此如果您的最低公共祖先节点是容器或控件或其他 CanvasItem 派生的 class 实例,则此方法应该可以正常工作。

我通过从 parent 元素发出信号来实现此功能,该信号似乎强制刷新:

canvas_item.emit_signal("item_rect_changed")

问题 child 得到刷新,与可见性方法不同,焦点被保留。