如何根据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
相关产品推荐
相关产品推荐

