最良のオプションは、他のオプションが次のとおりであるため、間違いなく単一NSAttributedString
のラベルでこれを行うことです。
複数のラベルを使用し、何かが変更されるたびにフレームを変更し、それらを移動し、スペースの幅を正確に把握し、画面やビューに対して幅が広すぎないようにします。ご覧のとおり、これはすぐに非常に苦痛になります。
UIWebView
これは、スクロールやズーム、JavaScript などの必要のない素晴らしい機能をすべて提供し、これらの機能はすべて CPU サイクルを使用しているため、単一のラベルを表示するには明らかにやり過ぎです。それらを使用するかどうかに関係なく、特にこれらを大量に使用する場合(たとえば、テーブルビューのすべてのセルに)、これはパフォーマンス面で非常に良いオプションではありません。
単一の文字列を使用する場合は、属性の範囲を正しく計算し、属性文字列を に割り当てるだけUILabel
ですattributedText
(注意、iOS 6+ のみですが、質問のタグから判断すると、それは問題ではありませんあなた)、そしてあなたは終わりました。私は現在、このアプローチをアプリ全体でかなり広範囲に使用しており、しばらくの間うまく機能しています (これに落ち着く前に他の 2 つを試しましたが、どちらも機能するのに非常に苦労しました)。
属性付き文字列を使用してこれを行う非常に基本的な例を次に示します。
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 50, 300, 50)];
label.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:16.0];
[self.view addSubview:label];
NSString *category = @"Socks";
NSString *store = @"Apple Store";
NSMutableAttributedString *string = [[NSMutableAttributedString alloc]
initWithString:[NSString stringWithFormat:
@"in %@ at %@ — 1 day ago",
category, store]];
[string addAttribute:NSForegroundColorAttributeName
value:[UIColor redColor]
range:[string.string rangeOfString:category]];
[string addAttribute:NSForegroundColorAttributeName
value:[UIColor redColor]
range:[string.string rangeOfString:store]];
label.attributedText = string;

たとえば、 と の値が同じである場合、 は指定された文字列の最初の出現を検出するため、これは期待どおりに機能しないことに注意しstore
てcategory
くださいrangeOfString:
。
より良い例:範囲を手動で計算しなければならないという煩わしさはありますが、文字列が等しいために壊れない、少し高度な例を次に示します。
NSString *in = @"in ";
NSString *category = @"in";
NSString *at = @" at ";
NSString *store = @"in";
NSString *text = [NSString stringWithFormat:@"%@%@%@%@ — 1 day ago",
in, category, at, store];
NSMutableAttributedString *string = [[NSMutableAttributedString alloc]
initWithString:text];
[string addAttribute:NSForegroundColorAttributeName
value:[UIColor redColor]
range:NSMakeRange(in.length, category.length)];
[string addAttribute:NSForegroundColorAttributeName
value:[UIColor redColor]
range:NSMakeRange(in.length + category.length + at.length,
store.length)];

すべての文字列が等しい場合でも、この方法は常に正しく機能しますが、強調表示する範囲を手動で計算する必要があるため、コード的には少し長くなります (ただし、これは実際には大きな問題や多くのコードではありません)。絶対的に)。
更新:太字フォントを使用するための簡単な例を追加するだけなので、探す必要はありません:
[string addAttribute:NSFontAttributeName
value:[UIFont fontWithName:@"HelveticaNeue-Bold" size:16.0]
range:NSMakeRange(in.length, category.length)];
[string addAttribute:NSFontAttributeName
value:[UIFont fontWithName:@"HelveticaNeue-Bold" size:16.0]
range:NSMakeRange(in.length + category.length + at.length,
store.length)];

必要な効果を得るために文字列に追加できるその他の属性については、NSAttributedString
UIKit
追加リファレンスを参照してください。