带有Core Text iPhone的上标,下标文本

时间:2011-07-22 06:49:12

标签: iphone core-text

任何人都可以解释一下,如何使用Core Text绘制上标和下标字母?

感谢。

2 个答案:

答案 0 :(得分:1)

我注意到这个问题有点陈旧,我希望你仍然需要这方面的帮助,这篇文章会对你有帮助。

您可以使用NSAttributedString(或其可变对应的NSMutableAttributedString)将不同的属性(例如字体,名称和大小)分配给单个字符串的特定范围。

核心文本本身不支持上标和下标,为了使它们看起来很好,您可能需要做很多工作。幸运的是,Oliver Drobnik开发了一个来自可可遗传学的开源项目,它允许您轻松地将HTML转换为NSAttributedString(或NSMutableAttributedString),将其提供给自定义textview并显示上标和下标(以及许多其他HTML和CSS),因为它们会出现在UIWebview中,但不需要使用UIWebview。您可以从here下载项目。

虽然已经为这个项目付出了很多努力,但有两点需要注意:

  1. 计算有时会非常耗费性能。
  2. 尚未支持所有HTML标记和CSS功能。

答案 1 :(得分:0)

如果NSAttributedString是可接受的解决方案,您可以使用NSAttributedString而不是Core Text创建上标/下标效果。我就这样做了:

NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:myString];
// Everything except the first character is rendered with the regular size / position
[str addAttribute:NSFontAttributeName 
     value:font 
     range:NSMakeRange(1, [amountString length]-1)];  // Everything except the first character is rendered with the regular size / position
// First character is 5/8 normal size
[str addAttribute:NSFontAttributeName 
     value:[UIFont fontWithName:initialFont.fontName 
     size:initialFont.pointSize/8*5] 
     range:NSMakeRange(0, 1)];
// Set the baseline offset to push the first character into a superscript position
[str addAttribute:@"NSBaselineOffset" 
     value:[NSNumber numberWithFloat:initialFont.pointSize*1/3] 
     range:NSMakeRange(0, 1)];  

关键行是最后两行,它们使超/子脚本文本的大小变小并改变它的垂直位置。值得注意的是,我使用的是字符串(@“NSBaselineOffset”)而不是定义的属性名称常量(NSBaselineOffsetAttributeName)。从我能够收集的内容来看,我相信NSBaselineOffsetAttributeName是在Mac的库中定义的,而不是在iOS中定义的(当我提出这个时,我正在开发它)。结果我使用名称字符串本身而不是属性名称的常量。