You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:13:27