Godot中按钮文本换行时无法正确调整尺寸的问题求助
问题原因
初始执行resize时,按钮的文本布局尚未完成,此时设置custom_minimum_size.x后,按钮的最小高度仍基于单行文本计算,无法适配换行后的文本高度。而窗口尺寸调整时,Godot会触发完整的控件布局更新流程,此时文本换行后的高度会被重新计算,按钮高度也随之自动调整,因此问题修复。
解决方法
方法1:延迟执行resize,等待控件初始化完成
在_ready中用call_deferred延迟调用resize,确保控件文本布局完成后再设置宽度,让按钮能正确计算换行后的高度:
func _ready() -> void: hide() get_tree().get_root().size_changed.connect(resize) # 延迟到当前帧结束后执行resize call_deferred("resize") show() func resize() -> void: custom_minimum_size.x = get_viewport_rect().size.x # 强制更新控件最小尺寸计算 update_minimum_size() # 让父VBox重新排序布局 get_parent().queue_sort()
方法2:用锚点实现宽度自适应(推荐)
放弃代码设置宽度,改用Godot内置的锚点系统让按钮自动适配屏幕宽度,布局系统会自动处理文本换行后的高度:
# 实例化按钮时设置锚点属性 var button = Button.new() button.text = "需要换行的长文本内容" button.wrap_text = true # 设置锚点让按钮宽度铺满父容器(VBox) button.anchor_left = 0.0 button.anchor_right = 1.0 button.margin_left = 0.0 button.margin_right = 0.0 # 添加到VBox中 $VBox.add_child(button)
这种方式不需要额外的resize函数,完全由布局系统自动维护宽度和高度,避免时序问题。
方法3:强制触发布局更新
如果坚持用代码设置宽度,在resize中强制触发控件和父容器的布局更新:
func resize() -> void: custom_minimum_size.x = get_viewport_rect().size.x # 更新自身最小尺寸 update_minimum_size() # 让父容器重新计算子控件布局 get_parent().queue_sort()
内容的提问来源于stack exchange,提问作者Skilopsaros
相关产品推荐
相关产品推荐

