2009-06-04 18 views
2

私はココアのアプリを持っていて、のコントロールを持っていて、そのテキストをNSAttributedStringで保持しています(実際はNSMutableAttributedStringだと思います)。私は簡単に設定し、その文字列内の異なる文字範囲で異なるテキスト属性(フォント、下線など)を変更することができます。NSAttributedString内のテキストに「非表示」属性を設定するにはどうすればよいですか?

ただし、テキストの一部をと非表示にする場合は、(CSS属性display: noneの効果に似ています)を設定します。外部イベントが発生すると(ボタンがクリックされたなど)、その特定の文字列を表示または非表示にしたいとします。

NSAttributedStringでこれを行うにはどうすればよいですか?

答えて

2

別の可能性は、非表示にしたいテキスト上のカスタム属性を使用することで、その後、自分自身を記述しますメソッドをNSAttributedStringのカテゴリに追加し、hiddenとしてマークされたテキストを除外する新しい属性付き文字列を作成します。

- (NSAttributedString *)attributedStringWithoutHiddenText { 
    NSMutableAttributedString *result = [[[NSMutableString alloc] init] autorelease]; 
    NSRange fullRange = NSMakeRange(0, [self length]); 
    NSRange range = NSZeroRange; 
    while (NSMaxRange(range) < [self length]) { 
     NSDictionary *attributes = [self attributesAtIndex:range.location longestEffectiveRange:&range inRange:fullRange]; 
     if ([[attributes objectForKey:MyHiddenTextAttribute] boolValue]) 
      continue; 

     NSAttributedString *substring = [[NSAttributedString alloc] initWithString:[[self string] substringWithRange:range] attributes:attributes]; 
     [result appendAttributedString:substring]; 
     [substring release]; 
    } 
    return result; 
} 

警告:など、私は完全にちょうど私の頭の上にこれをオフに書いた、そしてコンパイルする保証はありませんが、仕事、火の上のハードドライブを点灯、あなたの犬を蹴るない、

これでしょう描画に適した文字列を生成しますが、隠しテキストにアクセスするには元の文字列が必要になります。文字列のサイズによっては、メモリオーバーヘッドが大きくなる可能性があります。

+0

おっと、に隠されたテキストのフォントサイズを設定することです。私の言ったように、これはテストされていません:-) – Alex

+1

あなたのソリューションと私の違いについて言及する必要があります:あなたのコードは実際にはMyHiddenTextAttributeで文字を削除します。 –

+2

はい、このコードは表示にのみ適した文字列を作成することに注意してください。元の質問では、CSS表示:なし属性のようなものがありました。このメソッドで生成された文字列を描画すると、同様の効果が得られます。 – Alex

2

NSAttributedStringの不可視タイプの属性はありませんが、drawInRectをオーバーライドするNSAttributedString(または変更可能なバージョンですが、これは不要かもしれません)のサブクラスを作成することもできます。あなたの属性を持つテキスト。

これはちょっと混乱するかもしれません。

4

NSAttributedStringでサポートされている属性は、AppKitのNSAttributedString.hヘッダにリストされています。 「隠された」または「目に見える」ようなキーはありません。属性(スタイル)はhtmlから派生したものではなく、すべてのCSS機能を表現することはできません。

にもかかわらず、あなたが透明に描画色を設定することができ、文字の範囲を非表示にする:

NSMutableAttributedString* myString; 

[myString addAttribute:NSForegroundColorAttributeName 
       value:[NSColor clearColor] 
       range:NSMakeRange(0, 10)]; 
3

これは非常に古いスレッドであることを認識していますが、他の選択肢はカスタムグリフレンダリングです。コードフォールディングをカバーするWWDC 2010での高度なテキスト処理テクニックについてのセッションがありました。これは、これで行う必要があるものと同様のテクニックを使用します。これは、テキストが隠されているかどうかを調べて、実際の文字列ではなく隠しテキストのヌルグリフをレンダリングすることです。セッションは、セッション114 - WWDC 2010のビデオからの先進的なココアテキストのヒントとコツです。 Macデベロッパープログラムメンバーの方は、デベロッパーポータルからダウンロードできます。

3

簡単なオプションは、非常に最初の行にNSMutableAttributedStringしなければならない0

+0

'0.0'は無効ですが、' NSFont.systemFont(ofSize:0.1) 'はテキストを消します。あなたはクリアな色を必要としません。 – Jano

関連する問題