【发布时间】:2009-10-06 13:12:44
【问题描述】:
当我将格式化文本放入粘贴板 (NSRTFPboardType) 时,它会在粘贴时保留所有格式。但我真正想要的是丢弃字体和大小信息,同时保留重量、颜色等。
根据文档,没有字体信息的 NSAttributedString 将默认为 Helvetica 12,所以这似乎是一个死胡同。
我还可以按需生成文本,所以如果我可以找出当前 UI 元素中的字体,我可以在文本进入粘贴板之前对其进行修改。我希望可访问性 API 可以对此有所帮助,但我在 UIElementInspector 中找到的所有属性似乎都无法处理格式。
有什么想法吗?
这是一个测试用例。即使唯一的属性是绿色,它也会在 Helvetica 12 中粘贴:
// Create the string with no attributes, and strip the font just in case.
NSMutableAttributedString *s = [[[NSMutableAttributedString alloc] initWithString:@"Hello green world!"] autorelease];
[s removeAttribute:NSFontAttributeName range:NSMakeRange(0, [s length])];
// Add a test attribute
[s addAttribute:NSForegroundColorAttributeName value:[NSColor greenColor] range:NSMakeRange(6, 5)];
// Generate RTF data
NSData *rtf = [s RTFFromRange:NSMakeRange(0, [s length]) documentAttributes:nil];
// Copy to pasteboard
NSPasteboard *pb = [NSPasteboard generalPasteboard];
[pb declareTypes:[NSArray arrayWithObject:NSRTFPboardType] owner:nil];
[pb setData:rtf forType:NSRTFPboardType];
这里有一些有趣的东西。如果我尝试生成最简单的原始 RTF 数据,绝对没有字体信息,它仍然会粘贴到 Helvetica 12 中!
char *rawrtf = "{\\rtf1\\ansi\\ansicpg1252\n"
"Hello world.}";
NSData *rtf = [NSData dataWithBytes:rawrtf length:strlen(rawrtf)];
因此,如果这完全可能的话,我认为只有通过查询当前正在运行的应用程序的当前字体才有可能。
【问题讨论】:
-
您可以尝试使用
NSPasteboardTypeHTML将 HTML 添加到粘贴板,但我不太确定是否有可能实现您的目标。 -
我开始怀疑如果没有一些非常讨厌的黑客攻击是不可能的。大多数应用程序可能不接受 HTML 格式,但可能值得一试。
标签: objective-c cocoa