2009-06-04 3 views
2

Ich habe eine Cocoa-App mit einem NSTextView Steuerelement, das seinen Text in einem NSAttributedString hält (eigentlich glaube ich, es ist ein NSMutableAttributedString). Ich kann verschiedene Textattribute (wie Schriftart, Unterstreichung usw.) für verschiedene Zeichenbereiche innerhalb dieser Zeichenfolge einfach festlegen und ändern.Wie kann ich ein "verstecktes" Attribut für Text in NSAttributedString festlegen?

Allerdings möchte ich einen Teil des Textes als versteckt (ähnlich der Wirkung des CSS-Attributs display: none). Wenn ein externes Ereignis auftritt (z. B. eine angeklickte Schaltfläche), möchte ich diesen bestimmten Zeichenbereich einblenden oder ausblenden.

Gibt es das überhaupt mit NSAttributedString?

Antwort

2

Eine weitere Möglichkeit, ein benutzerdefiniertes Attribut für den Text, den Sie ausblenden möchten verwenden würde, und dann schreiben Sie Ihre eigenen Methode in einer Kategorie unter NSAttributedString, die eine neue attributierte Zeichenfolge erstellt, die den als ausgeblendet markierten Text ausschließt.

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

Caveat: ich total schrieb nur das aus der Spitze von meinem Kopf, und es ist nicht zu kompilieren garantiert, Arbeit, leuchtet die Festplatte auf Feuer, Ihren Hund nicht treten, usw.

Dies würde Erzeugen Sie eine Zeichenkette, die für das Zeichnen geeignet ist, aber Sie benötigen immer noch die ursprüngliche Zeichenkette für den Zugriff auf den versteckten Text. Abhängig von der Größe Ihrer Zeichenfolgen kann dies zu einem hohen Speicheraufwand führen.

+0

Oops zu setzen, dass in der ersten Zeile werden NSMutableAttributedString sollte. Wie gesagt, das wurde nicht getestet :-) – Alex

+1

Man sollte den Unterschied zwischen deiner und meiner Lösung erwähnen: Dein Code entfernt die Zeichen wirklich mit dem 'MyHiddenTextAttribute', während meine Lösung Leerzeichen im markierten Bereich zurücklässt. –

+2

Ja, und es ist wichtig zu bedenken, dass dieser Code eine Zeichenfolge erstellt, die nur für die Anzeige geeignet ist. Bei der ursprünglichen Frage wurde nach dem Attribut CSS-Anzeige: Keine gesucht. Wenn Sie die mit dieser Methode erzeugten Zeichenfolgen zeichnen, erhalten Sie einen ähnlichen Effekt. – Alex

2

Soweit ich weiß, gibt es keine unsichtbaren Typattribute für NSAttributedString, jedoch könnten Sie eine Unterklasse von NSAttributedString (oder die Mutable-Version, die aber möglicherweise nicht notwendig ist) erstellen, die drawInRect überschreibt: um zu vermeiden, den Teil von der Text, der dein Attribut hat.

Aber das könnte ein wenig unordentlich sein.

4

Die unterstützten Attribute für NSAttributedString sind in AppKits NSAttributedString.h-Header aufgeführt. Es gibt keinen Schlüssel wie "versteckt" oder "sichtbar". Die Attribute (Stile) sind nicht von HTML abgeleitet und können nicht alle CSS-Features ausdrücken.

Dennoch eine Reihe von Zeichen verstecken Sie die Vordergrundfarbe auf transparent festlegen:

NSMutableAttributedString* myString; 

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

Ich weiß, dies ist ein sehr alter Thread, aber die andere andere Option ist, benutzerdefinierte Glyph-Rendering zu tun. Es gab eine Sitzung über fortgeschrittene Textverarbeitungstechniken auf der WWDC 2010, die die Code-Faltung abdeckte. Dies verwendet eine ähnliche Technik wie das, was Sie tun müssen, und das ist, den Text zu untersuchen, wie es sich befindet, und den Null-Glyph für Ihren versteckten Text anstelle der tatsächlichen Zeichenfolge zu rendern. Die Sitzung ist Sitzung 114 - Erweiterte Kakao-Text Tipps und Tricks von WWDC 2010 Videos. Wenn Sie Mitglied des Mac Developer Program sind, können Sie diese über das Entwicklerportal herunterladen.

3

Eine einfache Möglichkeit ist, die Schriftgröße des verborgenen Text auf 0

+0

'0.0' ist ungültig, aber' NSFont.systemFont (ofSize: 0.1) 'lässt den Text verschwinden. Du brauchst nicht einmal die klare Farbe. – Jano

Verwandte Themen