如何解决UIButton中多行富文本标题无法居中对齐的问题
嘿,这个问题我之前踩过坑!你遇到的左对齐问题,核心原因是**NSAttributedString自带的段落样式优先级高于titleLabel.textAlignment的设置**——哪怕你给titleLabel设了居中,属性字符串里的左对齐样式会直接覆盖它。
问题根源
当你通过setAttributedTitle给按钮设置属性标题时,titleLabel的textAlignment这类基础样式设置会被属性字符串中的样式完全覆盖(numberOfLines是例外,它控制的是换行逻辑,所以你设为0是生效的)。而你的markdownParser.parse方法返回的属性字符串,大概率默认带了左对齐的段落样式。
解决步骤
因为你说markdownParser.parse方法无法修改,那我们可以在拿到返回的属性字符串后,手动给它添加居中的段落样式:
- 把不可变的
NSAttributedString转成可变的NSMutableAttributedString,保留原有markdown样式 - 创建居中的段落样式,应用到整个字符串范围
- 再把修改后的可变字符串设置给按钮
代码示例:
let title = markdownParser.parse(string: "my multiline string", fontSize: 15) // 转成可变属性字符串,保留原有的markdown样式 let mutableTitle = NSMutableAttributedString(attributedString: title) // 创建居中的段落样式 let centerParagraphStyle = NSMutableParagraphStyle() centerParagraphStyle.alignment = .center // 给整个字符串应用居中样式 mutableTitle.addAttribute( NSAttributedString.Key.paragraphStyle, value: centerParagraphStyle, range: NSRange(location: 0, length: mutableTitle.length) ) // 最后设置按钮的属性标题 aButton.setAttributedTitle(mutableTitle, for: .normal)
额外保险
为了彻底避免对齐问题,你还可以给按钮加上这一行设置,确保按钮的内容布局也是居中的:
button.contentHorizontalAlignment = .center
这样调整后,你的多行属性标题就能完美居中显示啦!
内容的提问来源于stack exchange,提问作者agazaur
相关产品推荐
相关产品推荐

