当我将格式化文本放入粘贴板 (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)];
所以如果这可能的话,我认为只有通过查询当前正在运行的应用程序的当前字体才有可能。
最佳答案
“当前字体”没有系统范围甚至应用程序范围的概念。您可以获得的最接近的是当前事件的 NSTextView
的输入属性;如果没有一个是事件的,那么就没有像当前字体那样的东西。
话虽如此,您可以向粘贴板 promise RTF 数据,当它请求它时,向当前事件的应用程序发送一个副本 AppleEvent 命令,等待响应,从粘贴板中拉出任何富文本,并获取其字体属性。如果没有可用的富文本,请坚持使用当前的字体和大小。我不知道这种启发式方法在实践中的效果如何,但我想不出任何更好的方法。
If I try and generate the plainest raw RTF data I can, with absolutely no font information, it still pastes in Helvetica 12!
当没有提供字体信息时,字体默认为 Helvetica-12,因为所有绘制的文本都必须采用 some 字体和 some 大小。 Helvetica-12 一定看起来具有可读性并且足够无害,因此被选为默认值。 (肯定比 Comic Sans-72 好!)
关于objective-c - cocoa :以当前字体粘贴格式化文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1521327/