如何在NSAttributedString中为文本设置“隐藏”属性?

时间:2009-06-04 08:57:13

标签: objective-c cocoa nsattributedstring

我有一个带有NSTextView控件的Cocoa应用程序,它将文本保存在NSAttributedString中(实际上我相信它是NSMutableAttributedString)。我可以轻松地在该字符串内的不同字符范围内设置和修改不同的文本属性(如字体,下划线等)。

但是,我想将文本的一部分设置为隐藏(类似于CSS属性display: none的效果)。当发生外部事件时(例如点击一个按钮),我想取消隐藏或隐藏特定范围的字符。

无论如何都要使用NSAttributedString吗?

5 个答案:

答案 0 :(得分:4)

NSAttributedString支持的属性列在AppKit的NSAttributedString.h标头中。没有像'隐藏'或'可见'的关键。属性(样式)不是从html派生的,也不能表达所有css功能。

尽管如此,要隐藏一系列字符,您可以将前景色设置为透明:

NSMutableAttributedString* myString;

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

答案 1 :(得分:3)

一个简单的选项是将隐藏文本的字体大小设置为0

答案 2 :(得分:2)

据我所知,NSAttributedString没有不可见的类型属性,但是你可以创建一个NSAttributedString的子类(或者可能没有必要的Mutable版本)来覆盖drawInRect:以避免绘制部分的具有您的属性的文本。

但这可能有点混乱。

答案 3 :(得分: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;
}

警告:我完全只是把它写在了我的头顶,而且不能保证编译,工作,点亮你的硬盘,不要踢你的狗等等。

这将生成一个适合绘图的字符串,但您仍然需要原始字符串来访问任何隐藏文本。根据字符串的大小,这可能是一个很大的内存开销。

答案 4 :(得分:2)

我意识到这是一个非常古老的线程,但另一个选择是进行自定义字形渲染。在WWDC 2010上有一个关于高级文本处理技术的会议,其中涉及代码折叠。这使用了与你需要做的相似的技术,那就是检查文本是否为lain out并为隐藏文本而不是实际字符串呈现空字形。会议是第114节 - 来自WWDC 2010视频的高级可可文本提示和技巧。如果您是Mac开发人员计划成员,可以通过开发人员门户网站下载这些成员。