You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 03:05:06