web-dev-qa-db-ja.com

NSAttributedStringを使用して下付き文字と上付き文字を作成する方法

化学式(H2O、Na ^ 2 +など)の添字を作成する必要がありますか?

これはNSAttributedStringで実行できますか、または添え字を作成する別の/より簡単な方法はありますか?

25
Mahir

これはNSAttributedStringで行うことができます。探している属性定数は、プラットフォームによって異なります。 Mac OS Xの場合はNSSuperscriptAttributeName、iOSの場合はkCTSuperscriptAttributeNameです。下付き文字には負の値を渡します。

唯一の注意点は、iOSのUILabelNSAttributedStringsを描画できないことです(ただし、iOS 6では指が交差しています)。 Core Textを使用してテキストを描画するか、UILabelを描画できるNSAttributedStringのサードパーティの代替品を見つける必要があります。

28
Mark Adams

これが私がiOS6で行ったことです。最初に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];

これが他の人の役に立つことを願っています。そこには多くの例はありません!

33
Robert Wasmann

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;
}       
9

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];
0
Bhushan

少しきれいにしたい場合は、次のこともできます

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

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