7

[[NSFontManager sharedFontManager] addFontTrait:(nullable id)sender]我想实现与仅使用我的代码相同的事情

文档状态

This action method causes the receiver to send its action 
message up the responder chain.
By default, the action message is changeFont:.
When a responder replies by providing a font to convert in
a convertFont: message, the receiver converts the font by 
adding the trait specified by sender. This trait is determined 
by sending a tag message to sender and interpreting it as a font 
trait mask for a convertFont:toHaveTrait: message.

所以我尝试了

NSFontManager * fm = [NSFontManager sharedFontManager];
NSFont * font = [fm selectedFont];
NSFont * modifiedFont = [fm convertFont:font toHaveTrait:NSFontItalicTrait];
[fm setSelectedFont:modifiedFont isMultiple:YES];
[NSApp sendAction:@selector(changeFont:) to:fm.target from:fm];

或者

[[self.window firstResponder] tryToPerform:@selector(changeFont:) with:modifiedFont];

但显然我错过了一些观点

NSFontManager 中的实际实现如何更改 NSTextField 上的字体以及如何重现

4

1 回答 1

1

这是一个有点hacky的方法。字体管理器检查发件人的标签,因此只需要匹配窗口Edit菜单中的标签

let bold = NSMenuItem()
bold.tag = 2
NSFontManager.shared.addFontTrait(bold)

这也适用于NSButton或任何带有标签的控件。这也意味着您无需编写任何代码就可以做到这一点。只需在情节提要中添加一个按钮,NSFontManager在场景中添加为对象即可。连接字体管理器对象的按钮,然后选择addFontTrait:

我还没有弄清楚如何以这种方式去除粗体。窗口菜单能够做到这一点。

于 2019-11-22T09:27:50.337 回答