2009-06-04 42 views
2

我有一個NSTextView控件的可可應用程序,它的文本保存在NSAttributedString(實際上我相信它是一個NSMutableAttributedString)。我可以在該字符串內的不同字符範圍內輕鬆設置和修改不同的文本屬性(如字體,下劃線等)。如何爲NSAttributedString中的文本設置「隱藏」屬性?

不過,我想設置文本的一部分隱藏(類似CSS屬性display: none的效果)。當發生外部事件(比如點擊一個按鈕)時,我想取消隱藏或隱藏特定範圍的字符。

有沒有辦法用NSAttributedString做到這一點?

回答

2

另一種可能性是使用你要隱藏的文本的自定義屬性,然後寫自己方法在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; 
} 

警告:這完全是我寫這個了我的頭頂部,它不能保證編譯,工作,點燃火你的硬盤驅動器,而不是踢你的狗,等

這生成適合繪製的字符串,但仍然需要原始字符串來訪問任何隱藏文本。根據你的字符串的大小,這可能是一個很大的內存開銷。

+0

糟糕,應該是第一行的NSMutableAttributedString。正如我所說的,這還沒有經過測試:-) – Alex 2009-06-04 14:20:00

+1

應該提到你的解決方案和我的區別:你的代碼真的用'MyHiddenTextAttribute'去除了字符,而我的解決方案在標記的Range處留下空格。 – 2009-06-04 16:00:49

2

據我所知,NSAttributedString沒有隱形類型屬性,但是你可以創建覆蓋drawInRect的NSAttributedString(或可變版本,但可能不是必需的)的子類:爲了避免繪製具有屬性的文本。

但是這可能有點混亂。

4

在AppKit的NSAttributedString.h標頭中列出了NSAttributedString的支持屬性。沒有像「隱藏」或「可見」的鍵。屬性(樣式)不是從html衍生而來的,不能表達所有的CSS特徵。

然而,隱藏字符的範圍,你可以設置前景色到透明:

NSMutableAttributedString* myString; 

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

我意識到這是一個非常老的線程,但另一個選項是自定義字形渲染。在WWDC 2010上有關於高級文本處理技術的會議討論了代碼摺疊。這使用了類似的技術來處理你需要做的事情,那就是檢查文本是否被隱藏,併爲你的隱藏文本渲染空字形而不是實際的字符串。本次會議是Session 114 - 來自WWDC 2010視頻的高級可可文本提示和技巧。如果您是Mac開發者計劃成員,則可以通過開發人員門戶下載這些內容。

3

一個簡單的選項是將隱藏文本的字體大小設置爲0

相關問題