3

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

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

无论如何要这样做NSAttributedString吗?

4

5 回答 5

5

NSAttributedString 支持的属性列在 AppKit 的 NSAttributedString.h 标头中。没有像“隐藏”或“可见”这样的键。属性(样式)不是从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

我意识到这是一个非常古老的线程,但另一个选择是进行自定义字形渲染。在 WWDC 2010 上有一个关于高级文本处理技术的会议,涵盖了代码折叠。这使用了与您需要做的类似的技术,即检查文本作为它的布局并为您的隐藏文本而不是实际字符串呈现空字形。会议是 Session 114 - Advanced Cocoa Text Tips and Tricks from WWDC 2010 视频。如果您是 Mac 开发者计划成员,您可以通过开发者门户下载这些内容。

于 2010-09-07T19:47:02.433 回答
2

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

但这可能有点混乱。

于 2009-06-04T09:54:58.743 回答
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;
}

警告:我完全只是在脑海中写下这个,并且不能保证编译,工作,点燃你的硬盘驱动器,不踢你的狗等。

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

于 2009-06-04T14:18:43.437 回答