Swift中如何为UILabel内各段落显示序号并单独设置序号颜色
实现方案
核心用NSMutableAttributedString就能搞定,不用自定义控件,UILabel原生支持,按以下步骤处理即可:
- 先清洗原始字符串:拿到服务端返回的字符串先调用
trimmingCharacters(in: .whitespacesAndNewlines)去掉首尾多余的换行、空白,避免Label开头结尾多出空行。 - 处理条目间距:不要硬把
\n替换成\n\n凑空行,后续改间距很麻烦,直接用NSParagraphStyle的paragraphSpacing属性控制每个条目之间的空距,lineSpacing控制单条内容内部的行高,适配不同字号也不会乱。 - 序号异色用正则匹配就行,不用手动拆分字符串:写个行首匹配的正则
^\d+\.,开anchorsMatchLines选项,就能精准匹配到每一行开头的「数字+点」格式的序号,不会误判正文里出现的数字加点内容,给匹配到的文本range单独设置前景色即可。
核心实现代码(Swift):
// 原始服务端返回字符串 let rawText = "\n1. You are Lorem ipsum doller sit amen Lorem ipsum doller sit amen Lorem ipsum doller sit amen . \n2. You are Lorem ipsum doller sit amen Lorem ipsum doller sit amen Lorem ipsum doller sit amen \n3. You are Lorem ipsum doller sit amen Lorem ipsum doller sit amen Lorem ipsum doller sit amen…\n" // 清洗首尾空白换行 let cleanText = rawText.trimmingCharacters(in: .whitespacesAndNewlines) // 初始化富文本,先设置正文默认样式 let totalAttr = NSMutableAttributedString( string: cleanText, attributes: [ .font: UIFont.systemFont(ofSize: 16, weight: .regular), .foregroundColor: UIColor.darkText // 正文颜色 ] ) // 匹配所有行首序号 let numberRegex = try! NSRegularExpression(pattern: #"^\d+\."#, options: .anchorsMatchLines) let totalRange = NSRange(cleanText.startIndex..., in: cleanText) let numberMatches = numberRegex.matches(in: cleanText, range: totalRange) // 给序号单独设置颜色 numberMatches.forEach { match in totalAttr.addAttribute( .foregroundColor, value: UIColor.systemBlue, // 换成你要的序号颜色 range: match.range ) } // 设置段落样式,控制行间距、条目间距 let paraStyle = NSMutableParagraphStyle() paraStyle.lineSpacing = 4 // 单条内容内部行间距 paraStyle.paragraphSpacing = 10 // 每条内容之间的空距,对应你要的空行效果 totalAttr.addAttribute(.paragraphStyle, value: paraStyle, range: totalRange) // 赋值给Label contentLabel.numberOfLines = 0 contentLabel.attributedText = totalAttr
几个注意点:
- 正则一定要开
anchorsMatchLines选项,不然^只会匹配整个字符串的开头,匹配不到第二、第三条的序号。 - 如果支持深色模式,颜色记得用动态颜色,不要写死固定RGB值。
- 不要用手动按
\n拆分字符串再拼富文本的方式,后续如果服务端返回的内容里本身带换行,很容易出现序号匹配错位的问题,正则行首匹配的鲁棒性更高。
内容的提问来源于stack exchange,提问作者Anilkumar iOS Developer
相关产品推荐
相关产品推荐

