2013-06-16 8 views
6

を帰せ:ダイナミック私は私のオプションは、次の操作を行うためのものであるかわからないんだけど、テキスト

enter image description here

赤のテキストは、実際には赤でレンダリングしても動的であるだろう - 長さが変化します。

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

または、ダッシュの前に各単語を独自のラベルにすることはできますか? (複数のラベルをインラインで配置し、サイズが大きくなるにつれて残りの部分を右に押すことが可能かどうかはわかりません)

+0

私は現在、私のアプリでこれを正確にやっています。私は1つの 'NSMutableAttributedString'を使ってハイライト属性を追加しています。私がこのアプローチで気づいた唯一の欠点は、ラベルテキストがローカライズされている可能性があるため、属性を追加する範囲を正確に計算するのは厄介であるということです。 – Greg

答えて

21

最適なオプションは間違いありません1つのラベル内の単一NSAttributedStringでこれを行う、あなたの他のオプションがあるので:

  1. 使用複数のラベル、何かが変わるたびに、そのフレームを変更、それらを動き回る、スペースがなければなりません正確にどのように広い把握、作りますあなたが見ることができるように、これは非常にすぐに非常に苦痛に終わるでしょう。

  2. スクロールやズーム、JavaScriptなどの必要のない驚異的なものをすべて提供しているため、明らかに1つのラベルを表示するのは難しいです(UIWebView)。機能はCPUサイクルを使用しているかどうかにかかわらず、使用しているかどうかにかかわらず、パフォーマンスの面では非常に良いオプションではありません。特に、これらの数が多い場合(テーブルのすべてのセルビュー)

あなたは、単一の文字列を使用している場合、あなたがしなければならないすべては、正しく属性の範囲を計算に属性文字列を割り当てているのに対し210 's attributedText注:、iOS 6+のみですが、問題のタグで判断すると問題はありません)、完了です。私は現在、このアプローチをアプリ全体を通して非常に広範に使用していますが、しばらくの間はうまくいきました(でした。これに着手する前に他の2つを試してみてください。例えば、storecategoryの価値がある、場合に予想されるとして、これは動作しないこと

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; 

注:ここでは

は属性付きの文字列を使用してこれを行うのは非常に基本的な例です同じで、rangeOfString:は、指定された文字列が最初に出現します。つまり、カテゴリ文字列が2回ハイライト表示され、ストア文字列がまったく表示されません。

良い例:

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)]; 

はここにもかかわらず、手動で範囲を計算することの追加迷惑で、理由は同じ文字列で中断されませんもう少し高度な例ですこの方法では常にが正しく動作しますが、たとえ文字列がすべて同じであっても、強調表示される範囲を手動で計算する必要があるため、コードワイズが少し長くなります(ただし、重要な問題や絶対的な意味での多くのコード)。

UPDATE:ちょうどあなたがそれを見てする必要はありませんので、太字フォントを使用するための簡単な例を追加:

[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)]; 

以上の属性のNSAttributedStringUIKit Additions Referenceを見てくださいあなたが望む効果を得るために文字列に追加することができます。

+1

すべての可能性を説明してくれてありがとう、最高のソリューション。 –

+0

+1すてきで詳細な回答! – Paaske

関連する問題