如何使用NSAttributedString制作下标和上标?

我需要为化学公式(H2O,Na ^ 2 +等)制作下标吗?

这是可能与NSAttributedString做,或者有一个替代/更简单的方法来制作下标吗?

这可能与NSAttributedString 。 您正在寻找的属性常量取决于您的平台。 对于Mac OS X,它是NSSuperscriptAttributeName ,在iOS上是kCTSuperscriptAttributeName 。 下标为负值。

唯一需要注意的是,iOS上的UILabel无法绘制NSAttributedString (但是iOS 6的手指交叉)。 你需要使用Core Text来绘制文本,或者find一些可以绘制NSAttributedString UILabel第三方replace。

这是我在iOS 6中所做的。首先添加CoreText和QuartzCore框架。 然后导入:

 #import <QuartzCore/QuartzCore.h> #import <CoreText/CTStringAttributes.h> #import <CoreText/CoreText.h> 

我做了一个小的函数,input一个普通的NSString,并用上标中的最后一个字符输出一个NSMutableAttributedString。 这可以修改为允许设置上标或下标,将kCTSuperscriptAttributeName值更改为-1。 你也可以添加一个variables来指定在string中上标的位置。 现在它只是假设string的结尾。

 - (NSMutableAttributedString *)plainStringToAttributedUnits:(NSString *)string; { NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:string]; UIFont *font = [UIFont systemFontOfSize:10.0f]; UIFont *smallFont = [UIFont systemFontOfSize:9.0f]; [attString beginEditing]; [attString addAttribute:NSFontAttributeName value:(font) range:NSMakeRange(0, string.length - 2)]; [attString addAttribute:NSFontAttributeName value:(smallFont) range:NSMakeRange(string.length - 1, 1)]; [attString addAttribute:(NSString*)kCTSuperscriptAttributeName value:@"1" range:NSMakeRange(string.length - 1, 1)]; [attString addAttribute:(NSString*)kCTForegroundColorAttributeName value:[UIColor blackColor] range:NSMakeRange(0, string.length - 1)]; [attString endEditing]; return attString; } 

现在,当我想要使用它时,我可以将它放在UITextField中:

  NSString *qlwUnitsPlainText = @"m3"; self.quantityLoadWeightUnits_textField.attributedText = [self plainStringToAttributedUnits:qlwUnitsPlainText]; 

我希望这有助于别人,那里没有太多的例子!

在iOS上,我错过了kCTSuperscriptAttributeName常量,但是字体大小和“基线”的效果很好。 它也给你一些更less的控制,不太听话的字体:

 + (NSAttributedString *)attributedStringForText:(NSString *)normalText andSuperscript:(NSString *)superscriptText textSize:(CGFloat)textSize { UIFont *normalFont = [Styles mainFontWithSize:textSize]; UIFont *superFont = [Styles mainFontWithSize:textSize / 2]; NSMutableAttributedString *finalStr = [[NSMutableAttributedString alloc] initWithString:normalText attributes:@{NSFontAttributeName: normalFont}]; NSAttributedString *superStr = [[NSAttributedString alloc] initWithString:superscriptText attributes:@{NSFontAttributeName: superFont, NSBaselineOffsetAttributeName:@(textSize/2)}]; [finalStr appendAttributedString:superStr]; return finalStr; } 

你也可以做如下,如果你想使它litle清洁

 NSDictionary *attr = @{ NSFontAttributeName: smallfont, (NSString*)kCTSuperscriptAttributeName: @1 } NSRange fabricWeightRange = NSMakeRange(fabricWeight.location + 2, 1); [subKeyString setAttributes:attr range:fabricWeightRange]; 

对于SubScript,使用kCTSuperscriptAttributeName的值作为@ -1。

根据该文件

@discussion值必须是CFNumberRef。 缺省值为int值0.如果受指定字体支持,则值为1将启用上标,值为-1则启用下标。

extern const CFStringRef kCTSuperscriptAttributeName CT_AVAILABLE(10_5,3_2);

  Example- [lblHeader setText:@“Headers [Alpha1 – text”]; NSMutableAttributedString *headerSubscript = [[NSMutableAttributedString alloc]initWithAttributedString: lblHeader.attributedText]; [headerSubscript addAttribute:(NSString *)kCTSuperscriptAttributeName value:@-1 range:NSMakeRange(14,1)]; [lblHeader setAttributedText:headerSubscript];