web-dev-qa-db-ja.com

NSAttributedString上付きスタイリング

テキストブロック内の®文字のすべてのインスタンスを上付きにしたい(当然のことながら法的免責事項))。デフォルトの方法NSAttributedStringはあまり良くありません。

文字をそのままにし、変更されていないNSStringのみを使用すると、大文字と同じサイズにレンダリングされ、ほぼベースラインに配置されます。次のようにNSAttributedStringに上付き属性を追加すると、

[attrStr setAttributes:@{(NSString *)kCTSuperscriptAttributeName : @1} range:NSMakeRange(locationOfReg, 1)];

キャラクターはベースラインから持ち上げられ、そのサイズは変更されませんが、浮き上がったキャラクターが上のラインに侵入するため、行間が影響を受けます。

説明する:

variants of (R)

この画像をPhotoshopで作成し、文字のサイズを縮小してベースラインをシフトすることにより、目的の位置を実現しました。 iOSでフォントサイズを変更する方法は知っていますが、ベースラインを変更するのは難しいようです。これを達成する方法について何か提案はありますか?

編集:ベースラインを上にシフトする方法として上付き属性を使用できると思います。現在のフォントサイズを取得する方法を理解し、同じサイズのテキストブロックで同じメソッドを使用できるように縮小することは、すばらしいことです。

33
SaltyNuts

次のコードはトリックを行うようです:

UIFont *fnt = [UIFont fontWithName:@"Helvetica" size:20.0];

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:@"GGG®GGG"
                                                                                     attributes:@{NSFontAttributeName: [fnt fontWithSize:20]}];
[attributedString setAttributes:@{NSFontAttributeName : [fnt fontWithSize:10]
                                  , NSBaselineOffsetAttributeName : @10} range:NSMakeRange(3, 1)];

enter image description here

67
kovpas

Swiftバージョン:

let fnt = UIFont(name:"Helvetica", size:20.0)
let attributedString = NSMutableAttributedString(string:"GGG®GGG", attributes:[NSFontAttributeName : fnt!])
attributedString.setAttributes([NSFontAttributeName : fnt!.fontWithSize(10), NSBaselineOffsetAttributeName: 10], range: NSRange(location: 3, length: 1))

Swift 4.2

私の例では、インフィニティシンボルの1つのインスタンスに添え字を付けて、ラベルのタイトルを次のようにします。 enter image description here

let font = UIFont(name: "Helvetica", size: 14.0)

let attributedString = NSMutableAttributedString(string: "Solids(ΔE∞)•G7®", attributes: [NSAttributedStringKey.font : font!])

attributedString.setAttributes([NSAttributedStringKey.baselineOffset: -5], range: NSRange(location: 9, length: 1))

solidsLbl.attributedText = attributedString
1
Bartosz Kunat

Swift 5

    let fnt = UIFont(name:"Helvetica", size:20.0)
    let attributedString = NSMutableAttributedString(string:"2.099", attributes:[NSAttributedString.Key.font : fnt!])
    attributedString.setAttributes([NSAttributedString.Key.font : fnt!.withSize(10), NSAttributedString.Key.baselineOffset: 10], range: NSRange(location: 4, length: 1))
0
AyAz