UIButton使用setTitle可调整大小但setAttributedTitle文本截断问题
问题根因
- 富文本属性缺失:你拼接的第二段纯文本
" Hello world"没有显式指定字体属性,尽管你单独设置了button.titleLabel?.font,但富文本未声明的属性不会自动继承titleLabel的配置,系统计算按钮 intrinsicContentSize 时会使用默认字体参数,导致计算出的宽度远小于实际渲染需要的宽度,最终文本被截断。 - 布局未主动更新:你仅在设置标题前调用了
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
相关产品推荐
相关产品推荐

