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

UIButton使用setTitle可调整大小但setAttributedTitle文本截断问题

问题根因
  1. 富文本属性缺失:你拼接的第二段纯文本" Hello world"没有显式指定字体属性,尽管你单独设置了button.titleLabel?.font,但富文本未声明的属性不会自动继承titleLabel的配置,系统计算按钮 intrinsicContentSize 时会使用默认字体参数,导致计算出的宽度远小于实际渲染需要的宽度,最终文本被截断。
  2. 布局未主动更新:你仅在设置标题前调用了layoutIfNeeded(),设置富文本标题后没有主动触发按钮固有尺寸的重新计算,UIStackView 仍然使用旧的尺寸参数布局按钮。
解决方案

按照以下步骤调整代码即可解决:

  • 给所有富文本片段显式指定完整的属性,确保和按钮标题的字体配置一致:
let desc = NSMutableAttributedString(
    string: "\u{25CF}", 
    attributes: [
        NSAttributedString.Key.font: UIFont.systemFont(ofSize: UIFont.buttonFontSize * 0.4, weight: .light)
    ]
)
// 给第二段文本也显式设置对应字体
desc.append(NSAttributedString(
    string: " Hello world",
    attributes: [
        NSAttributedString.Key.font: UIFont.systemFont(ofSize: 12, weight: .light)
    ]
))
button.setAttributedTitle(desc, for: .normal)
  • 设置完富文本标题后,主动触发按钮固有尺寸失效,再刷新父视图布局:
// 通知系统按钮的固有尺寸需要重新计算
button.invalidateIntrinsicContentSize()
// 触发父栈视图重新布局
stackView.layoutIfNeeded()
  • (可选)如果仍有截断,检查UIStackView的配置,确保alignment属性为.leading或.fill,且没有给栈视图添加小于内容总宽度的固定宽度约束。

内容的提问来源于stack exchange,提问作者Martin Perry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:24:05