3

NSTextView私は、テキストを保持するコントロールを備えたCocoaアプリを持っていますNSAttributedString(実際には、それはだと思いますNSMutableAttributedString)。その文字列内のさまざまな文字範囲で、さまざまなテキスト属性(フォント、アンダースコアなど)を簡単に設定および変更できます。

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

とにかくこれを行うことはありますNSAttributedStringか?

4

5 に答える 5

5

NSAttributedStringでサポートされている属性は、AppKitのNSAttributedString.hヘッダーにリストされています。'hidden'や'visible'のようなキーはありません。属性(スタイル)はhtmlから派生したものではなく、すべてのcss機能を表現できるわけではありません。

それでも、文字の範囲を非表示にするには、前景色を透明に設定できます。

NSMutableAttributedString* myString;

[myString addAttribute:NSForegroundColorAttributeName
                 value:[NSColor clearColor]
                 range:NSMakeRange(0, 10)];
于 2009-06-04T11:12:58.993 に答える
5

簡単なオプションは、非表示のテキストのフォントサイズを0に設定することです

于 2013-12-18T05:09:48.060 に答える
2

私の知る限り、NSAttributedStringには非表示の型属性はありませんが、drawInRectをオーバーライドするNSAttributedString(またはMutableバージョンですが、必要ない場合があります)のサブクラスを作成して、テキストの一部が描画されないようにすることができます。あなたの属性。

しかし、これは少し厄介かもしれません。

于 2009-06-04T09:54:58.743 に答える
2

もう1つの可能性は、非表示にするテキストにカスタム属性を使用してから、非表示NSAttributedStringとしてマークされたテキストを除外する新しい属性文字列を作成するカテゴリに独自のメソッドを作成することです。

- (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;
}

警告:私はこれを頭のてっぺんから書き留めただけで、コンパイル、動作、ハードドライブの火をつけたり、犬を蹴ったりすることは保証されていません。

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

于 2009-06-04T14:18:43.437 に答える
2

これは非常に古いスレッドだと思いますが、他のオプションはカスタムグリフレンダリングを行うことです。WWDC 2010で、コードの折り畳みをカバーする高度なテキスト処理技術に関するセッションがありました。これは、これで行う必要があるのと同様の手法を使用します。つまり、テキストがレイアウトされているかどうかを調べ、実際の文字列ではなく、非表示のテキストのnullグリフをレンダリングします。セッションはセッション114-WWDC2010ビデオからの高度なCocoaテキストのヒントとコツです。Mac開発者プログラムのメンバーの場合は、開発者ポータルからダウンロードできます。

于 2010-09-07T19:47:02.433 に答える