iOS开发:UILabel数字与百分号间自动添加双引号问题求助
解决UILabel自定义字体下数字+空格+百分号自动添加双引号的问题
我之前碰到过类似的字体渲染坑,结合你的描述(默认字体正常、仅数字+空格+%组合出问题),这大概率是自定义字体的字形替换规则Bug导致的——苹果的Core Text引擎在处理某些字体的特定字符组合时,错误触发了自动排版替换,把数字 %当成了需要特殊标记的场景,从而插入了双引号。
给你几个可行的解决思路:
1. 排查字体本身的问题
打开Mac的「字体册」(Font Book),导入你的自定义字体后,查看它的「连字」(Ligatures)或「字符替换」规则。有些字体为了排版美观,会对特定字符组合做自动替换,但这里明显是规则逻辑出错了。如果是字体本身的问题,要么联系字体开发者修复,要么换用该字体的官方优化版本。
2. 禁用UILabel的自动字符替换
通过设置attributedText强制关闭Core Text的自动连字和字符替换特性,代码示例:
let targetText = "25% 25 % 32 % 32% bleh% bleh %" let customFont = UIFont(name: "YourCustomFontName", size: 17)! // 替换成你的自定义字体 let attr: [NSAttributedString.Key: Any] = [ .font: customFont, .ligature: 0, // 完全禁用连字替换 .kern: 0 // 重置字间距,避免触发额外排版逻辑 ] self.amorce.attributedText = NSAttributedString(string: targetText, attributes: attr)
这种方法直接从根源上阻止Core Text对字符组合做自动修改,大概率能解决问题。
3. 手动修正文本中的问题组合
如果上面的方法无效,可以在设置文本前,提前处理有问题的字符组合:
- 方案一:直接把
数字+空格+%替换成数字%:
let fixedText = targetText.replacingOccurrences(of: "(\\d) (\\%)", with: "$1$2", options: .regularExpression) self.amorce.text = fixedText
- 方案二:用非断空格(
\u{00A0})代替普通空格,Core Text不会把非断空格当成排版分隔符,也就不会触发错误替换:
let fixedText = targetText.replacingOccurrences(of: "(\\d) ", with: "$1\u{00A0}", options: .regularExpression) self.amorce.text = fixedText
补充说明:你提到字母+空格+%正常,是因为字体的错误替换规则只针对「数字开头+空格+%」的组合,这种针对性的Bug在未针对iOS Core Text做优化的小众自定义字体里很常见。
内容的提问来源于stack exchange,提问作者Tiois




