iOS水平UIStackView中多行UILabel文本被截断如何修复

问题现象
水平UIStackView内的多行UILabel出现文本截断异常:
水平方向UIStackView左侧放置UIImage控件、右侧放置文本UILabel,UILabel已经设置numberOfLines = 0开启多行模式,预期长文本自动换行,但实际运行时文本被单行截断。
对应实现代码:
self.imageView = self.createIconImageView(...) self.textLabel.text = text self.textLabel.numberOfLines = 0 // 标记为多行模式 let stackView = UIStackView() stackView.axis = .horizontal stackView.alignment = .fill stackView.distribution = .fillProportionally stackView.spacing = 8.0 stackView.addArrangedSubview(self.imageView) stackView.addArrangedSubview(self.textLabel) self.containerView.addSubview(stackView) stackView.edgesToSuperview(insets: Style.containerInsets)
修复方法
问题根源是水平StackView做尺寸计算时,多行UILabel的固有内容尺寸默认按单行文本计算,加上当前配置的属性冲突,导致Label拿不到正确的可用宽度,无法触发换行。按以下调整即可解决:
- 调整水平方向内容抗压缩优先级
给UILabel设置更低的水平抗压缩优先级,让它在水平空间不足时不会强行撑满单行宽度,优先适配可用宽度换行:// 优先级低于ImageView的抗压缩优先级即可,默认750就满足需求 self.textLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal) - 修改StackView的distribution配置
当前使用的fillProportionally会按照子视图固有内容尺寸按比例分配横向空间,不适合「图片固定尺寸、文本占满剩余空间」的场景,替换为fill模式:stackView.distribution = .fill - 补全ImageView的尺寸约束(可选但推荐)
如果ImageView没有固定宽高约束,补充固定宽高约束,避免StackView计算尺寸时出现布局偏差:self.imageView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ self.imageView.widthAnchor.constraint(equalToConstant: 你的图标实际宽度), self.imageView.heightAnchor.constraint(equalToConstant: 你的图标实际高度) ])
调整完成后重新运行,UILabel会自动识别横向剩余可用宽度,长文本超出宽度时自动换行,不会再出现截断问题。
内容的提问来源于stack exchange,提问作者RainCast
相关产品推荐
相关产品推荐

