Posted at

TTTAttributedLabelを使って簡単縦書き

More than 5 years have passed since last update.

キャプチャ画像

今回は以下のライブラリを利用しました。

https://github.com/mattt/TTTAttributedLabel

「TTTAttributedLabel」フォルダをプロジェクトにコピー

「CoreText」フレームワークをプロジェクトに追加します。

#import "TTTAttributedLabel.h"

TTTAttributedLabel *lb = [[TTTAttributedLabel alloc] initWithFrame:CGRectMake(0, 0, 320, 320)];

lb.backgroundColor = [UIColor grayColor];
[self.view addSubview:lb];

//「setText」より前にラベルオプションは変更する。
lb.textColor = [UIColor whiteColor];
lb.numberOfLines = 0;
lb.font = [UIFont systemFontOfSize:20];
lb.verticalAlignment = TTTAttributedLabelVerticalAlignmentTop;

//ラベル自体を90°回転させる
CGFloat angle = M_PI/2;
lb.transform = CGAffineTransformMakeRotation(angle);

//表示文字を指定する
[lb setText:@"たてたてよこよこ、○描いてちょん!\nたてたてよこよこ、○描いてちょん。" afterInheritingLabelAttributesAndConfiguringWithBlock:^NSMutableAttributedString *(NSMutableAttributedString *mutableAttributedString) {

//縦文字に変更
[mutableAttributedString addAttribute:(NSString *)kCTVerticalFormsAttributeName value:[NSNumber numberWithBool:YES] range:NSMakeRange(0, [mutableAttributedString length])];

return mutableAttributedString;
}];




余談


ラベル自体の回転はスマートな解決ではないですが、一応それっぽくはなったと思います。

「kCTFrameProgressionAttributeName」オプションで文字送り方向を変えられるようですが、「TTTAttributedLabel」では正常に表示されませんでした。

オプション指定方法がわからずライブラリ本体の「drawFramesetter」を書き換えてみましたが、うまくいきませんでした。

CTFrameRef frame = CTFramesetterCreateFrame(framesetter, textRange, path, (__bridge CFDictionaryRef)[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCTFrameProgressionRightToLeft] forKey:(id)kCTFrameProgressionAttributeName]);

良い解決方法ありますでしょうか?