Swift 5:水平UIStackView内UIButton如何按标题长度自适应并保留内边距
问题解决方案
核心原因
该问题是水平排布的UIStackView内部视图抗压缩优先级冲突导致的:默认UILabel和UIButton的水平方向抗压缩优先级相同(均为750),当Label内容较长、StackView可用空间不足时,系统会随机选择压缩其中一个视图的尺寸。当保留UIButton的contentEdgeInsets时,按钮的内容总宽度更大,更容易被系统优先压缩,就会出现标题被截断的问题。
修复步骤
- 调整两个视图的水平抗压缩优先级,让系统优先压缩可换行的Label,保留按钮的完整展示空间
- 移除UIButton多余的
sizeToFit()调用,该方法会干扰StackView的自动布局计算 - 保留contentEdgeInsets设置,按钮的内边距会被自动布局正常计算在内
代码修改示例
Label部分补充设置
myLabel.numberOfLines = 0 // 降低Label的水平抗压缩优先级,优先压缩Label myLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
Button部分修改设置
myButton.setTitle(NSLocalizedString(self.textKey, comment: ""), for: .normal) myButton.uppercased() myButton.layer.cornerRadius = 6 // 保留内边距设置 myButton.contentEdgeInsets = UIEdgeInsets(top: 8, left: 10, bottom: 8, right: 10) // 移除手动sizeToFit调用,避免干扰自动布局 // myButton.sizeToFit() // 提升按钮的水平抗压缩优先级,确保按钮不会被挤压 myButton.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal) myButton.addBorder(hexString: SettingsProvider.sharedInstance.borderBoxColor, width: 0.2) myButton.addShadow(offset: CGSize.init(width: 0, height: 1), color: UIColor.init(hexString: SettingsProvider.sharedInstance.borderBoxColor), radius: 4, opacity: 0.35)
额外适配(可选)
如果按钮标题存在较长的场景需要支持换行,可额外添加以下设置:
myButton.titleLabel?.numberOfLines = 0 // 如需限制按钮最大宽度,可额外添加宽度约束 // myButton.snp.makeConstraints { make in // make.width.lessThanOrEqualTo(200) // }
内容的提问来源于stack exchange,提问作者Mathieu Rios
相关产品推荐
相关产品推荐

