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

时间:2011-12-18 23:37:21

标签: objective-c nsstring nsattributedstring

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

这可能与NSAttributedString有关,还是有替代/更简单的方式来制作下标?

4 个答案:

答案 0 :(得分:33)

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

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

我创建了一个小函数,它输入一个普通的NSString,并导出一个NSMutableAttributedString,其中包含上标中的最后一个字符。这可以修改为允许设置上标或下标,将kCTSuperscriptAttributeName值更改为-1。您还可以添加一个变量来指定将上标放在字符串中的位置。现在它只是假定字符串的结尾。

- (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];

我希望这有助于其他人,那里没有很多例子!

答案 1 :(得分:28)

这可以与NSAttributedString一起使用。您正在寻找的属性常量取决于您的平台。对于Mac OS X,它是NSSuperscriptAttributeName,在iOS上是kCTSuperscriptAttributeName。传递下标的负值。

唯一需要注意的是,iOS上的UILabel无法绘制NSAttributedString(但是,iOS 6的手指交叉)。您需要使用核心文本绘制文本或找到可以绘制UILabel的{​​{1}}的第三方替代。

答案 2 :(得分:7)

在iOS上,我错过了kCTSuperscriptAttributeName常量但是在字体大小和“基线”方面有很好的结果。对于不那么顺从的字体,它也为你提供了更多的控制:

+ (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;
}       

答案 3 :(得分:0)

如果你想让它变得更干净,你也可以做以下事情

NSDictionary *attr = @{ NSFontAttributeName: smallfont, 
                        (NSString*)kCTSuperscriptAttributeName: @1 }

NSRange fabricWeightRange = NSMakeRange(fabricWeight.location + 2, 1);                   
[subKeyString setAttributes:attr range:fabricWeightRange];