7

次のことを行うためのオプションが何であるかわかりません。

ここに画像の説明を入力

赤のテキストは実際には赤でレンダリングされ、動的でもあります。長さは変化します。

を使用してNSAttributedString、属性を適用する動的インデックスと長さを把握する必要がありますか?

または、ダッシュの前の各単語を独自のラベルにすることは可能ですか? (複数のラベルをインラインで配置し、サイズが大きくなるにつれてそれぞれが残りを右側に押し出すことが可能かどうかはわかりません。HTML/CSS でフローティングがどのように機能するかのようなものです)

4

1 に答える 1

22

最良のオプションは、他のオプションが次のとおりであるため、間違いなく単一NSAttributedStringのラベルでこれを行うことです。

  1. 複数のラベルを使用し、何かが変更されるたびにフレームを変更し、それらを移動し、スペースの幅を正確に把握し、画面やビューに対して幅が広すぎないようにします。ご覧のとおり、これはすぐに非常に苦痛になります。

  2. 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;

たとえば、 と の値が同じである場合、 は指定された文字列の最初の出現を検出するため、これは期待どおりに機能しないことに注意しstorecategoryください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追加リファレンスを参照してください。

于 2013-06-16T07:28:35.367 に答える