最近、私が抱えていた問題の最善の解決策は NSAttributedString インスタンスを使用することであると判断しました。少なくとも初心者には、ドキュメントが不足しているようです。stackoverflow に関する回答は、主に次の 2 種類でした。
- ドキュメントを読む
- AliSoftware の最も優れたOHAttributedLabelクラスを使用します。
私は2番目の答えが本当に好きです。しかし、私は NSAttributedString をよりよく理解したかったので、他の人に役立つ場合に備えて、属性付き文字列を組み立てて表示する最小の (?) 例をここに提供します。
ストーリーボードと ARC を使用して、iPad 用の Xcode (4.5.2) で新しい単一ウィンドウ プロジェクトを作成しました。
AppDelegate に変更はありません。
UIView に基づいて、AttributedStringView という名前の新しいクラスを作成しました。この単純な例では、drawAtPoint: メソッドを使用して属性付きの文字列を画面に配置するのが最も簡単です。これには有効なグラフィックス コンテキストが必要であり、UIView サブクラスの drawRect: メソッド内で最も簡単に利用できます。
ViewController.m の全体を次に示します (ヘッダー ファイルは変更されていません)。
#import "ViewController.h"
#import "AttributedStringView.h"
@interface ViewController ()
@property (strong, nonatomic) AttributedStringView *asView;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self.view addSubview:self.asView];
}
- (AttributedStringView *)asView
{
if ( ! _asView ) {
_asView = [[AttributedStringView alloc] initWithFrame:CGRectMake(10, 100, 748, 500)];
[_asView setBackgroundColor:[UIColor yellowColor]]; // for visual assistance
}
return _asView;
}
@end
そして、ここに AttributedStringView.m の全体を示します (ヘッダー ファイルに変更は加えられていません)。
#import "AttributedStringView.h"
@interface AttributedStringView ()
@property (strong, nonatomic) NSMutableAttributedString *as;
@end
@implementation AttributedStringView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
NSString *text = @"A game of Pinochle is about to start.";
// 0123456789012345678901234567890123456
// 0 1 2 3
_as = [[NSMutableAttributedString alloc] initWithString:text];
[self.as addAttribute:NSFontAttributeName value:[UIFont boldSystemFontOfSize:36] range:NSMakeRange(0, 10)];
[self.as addAttribute:NSFontAttributeName value:[UIFont italicSystemFontOfSize:36] range:NSMakeRange(10, 8)];
[self.as addAttribute:NSFontAttributeName value:[UIFont boldSystemFontOfSize:36] range:NSMakeRange(18, 19)];
if ([self.as size].width > frame.size.width) {
NSLog(@"Your rectangle isn't big enough.");
// You might want to reduce the font size, or wrap the text or increase the frame or.....
}
}
return self;
}
- (void)drawRect:(CGRect)rect
{
[self.as drawAtPoint:CGPointMake(0, 100)];
}
@end