属性付きテキストによるテキストの装飾(後編)

NSWritingDirectionAttributeName(iOS 7以降)
テキストの方向を指定するためのNSNumber(int)を含むNSArrayオブジェクトです。
テキストの方向は、0から3までの値で示します。
なお、この値はUnicodeの双方向アルゴリズム(Unicode Bidirectional Algorithm)における制御文字と同等の意味を持ちます。
[表4] NSWritingDirectionAttributeNameに指定する値と意味
値 | Unicode制御文字 | 定義 |
---|---|---|
0 | LRE | NSWritingDirectionLeftToRight | NSTextWritingDirectionEmbedding |
1 | RLE | NSWritingDirectionRightToLeft | NSTextWritingDirectionEmbedding |
2 | LRO | NSWritingDirectionLeftToRight | NSTextWritingDirectionOverride |
3 | RLO | NSWritingDirectionRightToLeft | NSTextWritingDirectionOverride |
NSWritingDirectionLeftToRightは左から右、NSWritingDirectionRightToLeftは右から左への書式方向を示します。また、NSTextWritingDirectionEmbeddingは単語単位で指定の方向へ表記するのに対し、NSTextWritingDirectionOverrideは文字をすべて指定の方向に表記します。
この属性は、日本語や英語などの左から右に表記する言語と、ヘブライ語やアラビア語など右から左に表記する言語が混在する際に、表記する方向を明示的に指定するために使用できます。
例えば、ヘブライ語と英語が混在しているテキストでは、先頭にヘブライ語があると、それに続く英語部分が、ヘブライ語の左にきてしまいます。これを防ぐために、NSWritingDirectionAttributeName属性を使用して、文章全体は左から右への書式であることを明確にする必要があります。
[ソースコード30] 書式方向の指定
01 | NSString *hebrewTitle = textField.text; // ヘブライ語(右から左) |
02 | NSString *text = |
03 | [NSString stringWithFormat:@"%@ is the title in Hebrew.", hebrewTitle]; |
04 | |
05 | // 属性指定なしのテキスト(文頭がヘブライ語) |
06 | NSAttributedString *normalText = [[NSAttributedString alloc] initWithString:text]; |
07 |
08 | NSMutableAttributedString *bidiText = normalText.mutableCopy; |
09 | // ヘブライ語は右から左 |
10 | NSRange hebrewRange = [bidiText.string rangeOfString:hebrewTitle]; |
11 | [bidiText addAttribute:NSWritingDirectionAttributeName |
12 | value:@[@1] |
13 | range:hebrewRange]; |
14 | // 文章全体は左から右 |
15 | [bidiText addAttribute:NSWritingDirectionAttributeName |
16 | value:@[@0] |
17 | range:NSMakeRange(0, bidiText.length)]; |
上記の例を表示した結果が、図12となります。

図12: 方向指定なし(上)と方向指定あり(下)
NSVerticalGlyphFormAttributeName
縦書き用グリフを指定するためのNSNumberオブジェクトです。0が横書き、1が縦書きを意味しますが、iOSでは常に横書きが用いられ、0以外の値は無視されます。