iOS Monospaced自定义字体

时间:2016-01-02 22:34:13

标签: ios fonts core-text monospace

我的Xcode 7,iOS 9目标项目中包含自定义字体。我想使字体等宽。我试过这个,但没有工作:

let originalFont = UIFont(name: "My Custom Font", size: 18)
let originalFontDescriptor = originalFont!.fontDescriptor()

let fontDescriptorFeatureSettings = [
    [
        UIFontFeatureTypeIdentifierKey: kNumberSpacingType,
        UIFontFeatureSelectorIdentifierKey: kMonospacedNumbersSelector
    ]
]

let fontDescriptorAttributes = [UIFontDescriptorFeatureSettingsAttribute: fontDescriptorFeatureSettings]
let fontDescriptor = originalFontDescriptor.fontDescriptorByAddingAttributes(fontDescriptorAttributes)
let font = UIFont(descriptor: fontDescriptor, size: 0)

topLabel.font = font

无论有无上述代码,标签都会以适当的自定义字体显示。它只是在代码之上并没有做任何事情。

3 个答案:

答案 0 :(得分:0)

您使用的代码不是使字体等宽。

调整字体以在等宽模式下呈现数字。所以这个字体数字都有相同的宽度。

下面是一个带有4个标签的示例,1是使用自定义字体Docis Light,第2个是带有等宽数字的Docis Light,第3个是相同大小的系统字体,第4个是带有等宽数字的系统字体:

monospaced digits font tweak in ios

如您所见,此自定义字体已经支持开箱即用的等宽数字功能,无需调整。

如果您需要使用等宽字体(不仅仅是数字)字体,您必须使用自定义等宽字体(设计为等宽字体),或者您可以使用内置的iOS等宽字体,如Courier或Menlo(查看所有可用的iOS字体)在http://iosfonts.com/

这是他们在相同情况下的样子:

courier and menlo monospaced iOS fonts

无论有没有调整,它们都是等宽的,数字也是等宽的。

我在这里回答了类似的问题,可能,我应该只链接answer而不是图片,但它更直观。

答案 1 :(得分:0)

不要忘记导入标题文件。希望它会奏效。此解决方案位于 Objective-C

#import <CoreTextArcView.h>

UIFont *const existingFont = [UIFont preferredFontForTextStyle:   UIFontTextStyleBody];
UIFontDescriptor *const existingDescriptor = [existingFont fontDescriptor];

NSDictionary *const fontAttributes = @{

UIFontFeatureTypeIdentifierKey 

UIFontDescriptorFeatureSettingsAttribute: @[
 @{
   UIFontFeatureTypeIdentifierKey: @(kNumberSpacingType),
   UIFontFeatureSelectorIdentifierKey: @(kMonospacedNumbersSelector)
  }]
};

UIFontDescriptor *const monospacedDescriptor = [existingDescriptor  fontDescriptorByAddingAttributes: fontAttributes];
UIFont *const proportionalFont = [UIFont fontWithDescriptor: monospacedDescriptor size: [existingFont pointSize]];

答案 2 :(得分:0)

我的以下回答仅是将等距的现有字体的数字(不是整个字体)(如果字体支持)

至少我在寻找找到该线程时使数字等距。因此,尽管它回答了另一个问题,但我希望它会有所帮助。

这很好用,已在Swift 5和iOS14 + 13上测试:

(只要“您的字体支持等宽数字功能” 。)

extension UIFont {

    var monospacedDigitFont: UIFont {
        let oldFontDescriptor = fontDescriptor
        let newFontDescriptor = oldFontDescriptor.monospacedDigitFontDescriptor
        return UIFont(descriptor: newFontDescriptor, size: 0)
    }

}

private extension UIFontDescriptor {

    var monospacedDigitFontDescriptor: UIFontDescriptor {
        let fontDescriptorFeatureSettings = [[UIFontDescriptor.FeatureKey.featureIdentifier: kNumberSpacingType, UIFontDescriptor.FeatureKey.typeIdentifier: kMonospacedNumbersSelector]]
        let fontDescriptorAttributes = [UIFontDescriptor.AttributeName.featureSettings: fontDescriptorFeatureSettings]
        let fontDescriptor = self.addingAttributes(fontDescriptorAttributes)
        return fontDescriptor
    }
}

然后您可以在任何这样的标签上使用它:

/// Label with monospacing activated
myLabel.font = myLabel.font.monospacedDigitFontDescriptor

/// Label with monospacing not activated (default is proportional spacing)
myLabel.font = myLabel.font

(来源:https://blog.usejournal.com/proportional-vs-monospaced-numbers-when-to-use-which-one-in-order-to-avoid-wiggling-labels-e31b1c83e4d0