objective-c - cocoa :以当前字体粘贴格式化文本?

标签 objective-c cocoa

当我将格式化文本放入粘贴板 (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/

相关文章:

objective-c - 仅通过模型 Controller (API 包装器)更新模型对象的最佳方法是什么

ios - 如果手机在同步前死机,nsuserdefault 数据会发生什么

ios - 尝试在 Objective-C 中解析日期时出现错误

objective-c - 显示 Yes-No NSAlert 模式并在同一方法中获取值

objective-c - 从 USB MIDI 键盘获取 MIDI,cocoa mac

objective-c - QTMovie 设置速率问题

ios - 点击 UITextField 时如何打开 UIDatePicker

macos - 输入法 (IMKit) 设置问题

objective-c - 获取 Mac 操作系统中的文件类型

objective-c - 为什么基于自动布局的 NSWindow 在缩放后重绘不正确?