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

如何根据titleLabel长度调整UIButton尺寸,限制最大宽度为屏幕一半

修复方案

你遇到的问题是sizeToFit()不会主动限制最大宽度,文字长度超过屏幕宽度时会直接横向拉伸按钮。可按以下步骤修改代码:

1. 修正init方法中的约束(原来注释的约束左锚点配置错误导致失效)

将init方法中注释的约束替换为以下代码:

mainBody.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    mainBody.topAnchor.constraint(equalTo: self.topAnchor),
    mainBody.leadingAnchor.constraint(equalTo: self.leadingAnchor),
    mainBody.trailingAnchor.constraint(equalTo: self.trailingAnchor),
    mainBody.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -tipHeight)
])

2. 替换presentCallout方法中的尺寸计算逻辑

将原来的mainBody.sizeToFit()替换为带最大宽度限制的尺寸计算代码:

// 原有title配置逻辑保留
mainBody.setTitle(representedObject.title!, for: .normal)
mainBody.titleLabel?.lineBreakMode = .byWordWrapping
mainBody.titleLabel?.numberOfLines = 0

// 计算最大允许宽度为屏幕宽度的一半
let maxButtonWidth = UIScreen.main.bounds.width * 0.5
// 扣除按钮内边距后是文字可用的最大宽度
let maxTitleWidth = maxButtonWidth - mainBody.contentEdgeInsets.left - mainBody.contentEdgeInsets.right

guard let title = mainBody.titleLabel?.text, let font = mainBody.titleLabel?.font else {
    mainBody.sizeToFit()
    return
}
// 计算限制宽度下的文字实际尺寸
let titleSize = title.boundingRect(
    with: CGSize(width: maxTitleWidth, height: .greatestFiniteMagnitude),
    options: [.usesLineFragmentOrigin, .usesFontLeading],
    attributes: [.font: font],
    context: nil
).size

// 计算按钮最终尺寸
let finalButtonWidth = min(titleSize.width + mainBody.contentEdgeInsets.left + mainBody.contentEdgeInsets.right, maxButtonWidth)
let finalButtonHeight = titleSize.height + mainBody.contentEdgeInsets.top + mainBody.contentEdgeInsets.bottom
mainBody.bounds = CGRect(x: 0, y: 0, width: finalButtonWidth, height: finalButtonHeight)

修改完成后,按钮宽度最大为屏幕宽度的一半,文字超出时自动换行,按钮高度会跟随文字行数自适应调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:18:00