iOS13中NSAttributedString上下标显示异常问题求助
iOS 13 非系统字体下 UITextView 上下标失效的解决办法
这个问题我之前踩过坑!iOS 13 对 UITextView 渲染非系统字体时的 Core Text 属性支持做了调整,导致你用 kCTSuperscriptAttributeName 这种 Core Text 专属属性时,只有系统字体能正常解析,第三方字体就会失效。下面给你两个亲测有效的解决方案:
方案一:用 UIKit 原生属性模拟上下标(推荐)
放弃 Core Text 的 kCTSuperscriptAttributeName,改用 NSBaselineOffsetAttributeName(基线偏移)配合字体大小缩放来模拟上下标,这个方法对所有字体都通用,不受系统版本限制。
修改你的代码如下:
- (void)viewDidLoad { [super viewDidLoad]; // 换成你需要的非系统字体 UIFont* font = [UIFont fontWithName:@"Helvetica Neue" size:32]; NSMutableAttributedString* as = [[NSMutableAttributedString alloc] initWithString:@"Super2Script" attributes:@{NSFontAttributeName : font}]; // 模拟上标:缩小字体+上移基线 UIFont* superscriptFont = [UIFont fontWithName:font.fontName size:font.pointSize * 0.6]; // 字体缩小为原大小的60% [as addAttribute:NSFontAttributeName value:superscriptFont range:NSMakeRange(5, 1)]; [as addAttribute:NSBaselineOffsetAttributeName value:@(font.pointSize * 0.3) range:NSMakeRange(5, 1)]; // 基线向上偏移原字体高度的30% UITextView* tv = [[UITextView alloc] initWithFrame:CGRectZero]; tv.attributedText = as; [tv sizeToFit]; [self.view addSubview:tv]; tv.center = CGPointMake(self.view.bounds.size.width / 2, self.view.bounds.size.height / 2); }
你可以根据需求调整字体缩放比例和基线偏移值,找到最贴合的视觉效果。
方案二:检查字体是否包含上下标字形
有些第三方字体本身没有内置的上标/下标字形,系统字体因为 Apple 做了专门优化,所以能完美支持 Core Text 的上下标属性。你可以用 Mac 自带的「字体册」打开字体文件,查看是否有 Superscript 或 Subscript 类的字形:
- 如果字体有这些字形,可以尝试升级到 iOS 14+(Apple 在后续版本修复了部分非系统字体的 Core Text 属性支持问题)
- 如果字体没有这些字形,那只能用方案一的模拟方式来实现上下标
内容的提问来源于stack exchange,提问作者Scotty
相关产品推荐
相关产品推荐

