El Capitan介绍了旧金山系统字体,默认情况下具有比例数字。
这使得表格列中的数字显得锯齿状,难以比较:
我想为字体启用固定宽度数字选项,但继续使用默认系统字体并保持与早期版本OS X的向后兼容性。
在Interface Builder中选择字体>字体面板>排版>等宽数字不影响字体(XIB文件保持不变)。
在OS X表格视图列中设置等宽数字的正确方法是什么? (我怀疑IB无法使用,因此编程解决方案也可以。)
答案 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的变体
假设res
是NSTextField
,其中包含要显示的数字:
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
}
}
答案 3 :(得分:2)