如何设置NSTableView列以使用等宽数字?

时间:2015-11-27 09:46:06

标签: cocoa fonts nstableview osx-elcapitan

El Capitan介绍了旧金山系统字体,默认情况下具有比例数字。

这使得表格列中的数字显得锯齿状,难以比较:

all are 6-digit numbers

我想为字体启用固定宽度数字选项,但继续使用默认系统字体并保持与早期版本OS X的向后兼容性。

在Interface Builder中选择字体>字体面板>排版>等宽数字影响字体(XIB文件保持不变)。

useless panel

在OS X表格视图列中设置等宽数字的正确方法是什么? (我怀疑IB无法使用,因此编程解决方案也可以。)

4 个答案:

答案 0 :(得分:9)

只要在+[NSFont monospacedDigitSystemFontOfSize:weight:]可用时使用即可。它是10.11中的新功能,但仍然不在NSFont文档中。它位于标题中,并在WWDC 2015视频中进行了讨论。所以,像:

if ([NSFont respondsToSelector:@selector(monospacedDigitSystemFontOfSize:weight:)])
    textField.font = [NSFont monospacedDigitSystemFontOfSize:textField.font.pointSize weight:NSFontWeightRegular];

答案 1 :(得分:3)

将以下内容视为伪代码,快速完成,不经过彻底测试等。

如果NSFont表示将等宽数字作为要素的字体,则以下方法将生成另一个NSFont并选择该要素:

- (NSFont *) newMonospaceNumbersFont:(NSFont *)font
{
   CTFontDescriptorRef origDesc = CTFontCopyFontDescriptor((__bridge CTFontRef)font);
   CTFontDescriptorRef monoDesc = CTFontDescriptorCreateCopyWithFeature(origDesc, (__bridge CFNumberRef)@(kNumberSpacingType), (__bridge CFNumberRef)@(kMonospacedNumbersSelector));
   CFRelease(origDesc);
   CTFontRef monoFont = CTFontCreateWithFontDescriptor(monoDesc, font.pointSize, NULL);
   CFRelease(monoDesc);
   return (__bridge_transfer NSFont *)monoFont;
}

你可以使用它来获取UI元素的当前字体并将其转换为带有等宽数字的字体。

HTH

Swift的变体

假设resNSTextField,其中包含要显示的数字:

let origDesc = CTFontCopyFontDescriptor(res.font!)
let monoDesc = CTFontDescriptorCreateCopyWithFeature(origDesc, kNumberSpacingType, kMonospacedNumbersSelector)
let monoFont = CTFontCreateWithFontDescriptor(monoDesc, res.font!.pointSize, nil)
res.font = monoFont

答案 2 :(得分:3)

这是一个Swift扩展,为您提供具有高可读性的等宽数字字体。

extension NSFont {
    var legibleNumbersVariant: NSFont {
        let features = [
            [NSFontFeatureTypeIdentifierKey: kNumberSpacingType,
             NSFontFeatureSelectorIdentifierKey: kMonospacedNumbersSelector],
            [NSFontFeatureTypeIdentifierKey: kStylisticAlternativesType,
             NSFontFeatureSelectorIdentifierKey: kStylisticAltSixOnSelector]
        ]
        let descriptor = fontDescriptor.addingAttributes([NSFontFeatureSettingsAttribute: features])
        return NSFont(descriptor: descriptor, size: pointSize) ?? self
    }
}

Comparison

答案 3 :(得分:2)

根据我的经验,"字体面板"功能没有很好地定义,每当我弄乱XIB或故事板时,我通常都会忽略它。

应该做些什么才能回到那个"字体"在“文本字段单元格”属性检查器中选择属性,然后选择“用户固定间距”#34;从字体下拉菜单中(选项应自动默认为大小11)。

Choose your font this way

如果你将字体大小提高一点,它就会神奇地切换到Monaco(默认的固定宽度字体)。