在Objective-C中更改所选文本的字体

时间:2013-03-02 00:01:22

标签: objective-c macos cocoa nstextview

我正在尝试为Mac应用程序(不是iOS应用程序)创建自定义“更改字体”NSPopupButton。我可以检测到字体选择的变化:

long fontItemIndex = [fontPopup indexOfSelectedItem];
NSMenuItem *fontItem = [fontPopup itemAtIndex:(int)selectedFontItemIndex];
NSString *fontName = [selectedFontItem title];

鉴于此字体名称的NSString,我似乎无法找到如何将我的NSTextView textView中的选定文本实际更改为此新字体。

我只是被official documentation弄得眼花缭乱:似乎convertFont:toFamily:是我需要的。当我这样做时:

NSFont *font = [NSFont fontWithName:fontName size:12.0];
[textView setFont:font];

它设置文本视图中的所有文本,而不仅仅是所选文本。但是当我这样做时:

NSFontManager *fontManager = [NSFontManager sharedFontManager];
[fontManager convertFont:[fontManager selectedFont] toFamily:fontName];

它没有做任何事情。我错过了什么?

3 个答案:

答案 0 :(得分:4)

NSTextView内部是NSTextStorageNSAttributedString的子类),您必须修改名为NSFontAttributeName的属性。

首先获取要更改字体属性的范围:

NSRange selection = textView.selectedRange;

现在将font属性添加到选择中:

NSFont *font = [NSFont fontWithName:fontName size:12.0f];
[self.textView.textStorage addAttributes:@{NSFontAttributeName: font}
  range:selection];

根据NSPopUpButton的内容,只需使用fontWithName:size:作为字体名称调用title即可获得刚刚选择的字体。但是,如果您已经执行的方法不起作用,则可能必须从字体系列名称中获取特定字体。 availableMembersOfFontFamily:上的NSFontManager会为您提供所有可用字体的列表。您可以使用其中一个来初始化特定字体。

答案 1 :(得分:0)

查看NSText上的setFont:range:方法,NSTextView的超类。

(范围当然来自NSTextView上的selectedRanges属性。)

答案 2 :(得分:0)

这就是我需要更改textview中的所有文本。

[textview setFont:[NSFont fontWithName:@"Courier" size:14]];