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

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

NSAttributedStringを使ってこれを行うことは可能ですか?または、サブスクリプトを作成する代替/簡単な方法がありますか?

23

5 答え

ここでは、私がiOS 6で行った作業を紹介します。まず、CoreTextとQuartzCoreフレームワークを追加します。その後、インポート:

#import 
#import 
#import 

私は単純な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
追加された
どうすれば削除できますか
追加された 著者 H Raval,
NSMakeRangeパラメータは、firstPositionとlastPositionの代わりにfirstPositionとlengthであるべきではありません。この例では、読者は誤解を招く可能性があります。
追加された 著者 dwbrito,
attributedStringのこの部分を見てください。 gist.github.com/mladjan/6663691上付き文字を表示したくない:(
追加された 著者 dormitkon,

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

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

28
追加された
ありがとう。 kCTSuperscriptAttributeNameを使用して上付き文字を作成できますか?
追加された 著者 Mahir,
申し訳ありませんが、私はそれを逃したか分かりません。再度、感謝します。
追加された 著者 Mahir,
はい、私が述べたように、正の値は上付き文字です。添え字の負の値。
追加された 著者 Mark Adams,
UILabel は、今までに attributedString プロパティを介して NSAttributedString をサポートしていることに注意してください。 kCTSuperscriptAttributeName の値は、 -1 1 との間の小数点以下の値にすることもできます。
追加された 著者 Bensge,

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;
}       
6
追加された
ありがとう@ハリありがとう
追加された 著者 Ramdhas,
@AadilKeshwaniフォント、サイズ、色、およびアプリケーションに関連する他のスタイルを集中化する静的クラスです。
追加された 著者 Hari Karam Singh,
ここで Styles とは何ですか?
追加された 著者 Aadil Keshwani,

リットルクリーナーにしたい場合は、次の操作を行うこともできます

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

NSRange fabricWeightRange = NSMakeRange(fabricWeight.location + 2, 1);                   
[subKeyString setAttributes:attr range:fabricWeightRange];
0
追加された

サブスクリプトの場合は、kCTSuperscriptAttributeNameの値を@ -1とします。

     

ドキュメントごとに

     

@discussion値はCFNumberRefでなければなりません。デフォルトはint値0です。   サポートされる                   指定されたフォントで、1の値は上付きを有効にし、a                   値-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
追加された
@Bhargavラオそれは迅速に、thatsなぜ私はこの答えを書いているthatsです。
追加された 著者 Dharmbir Singh,