iOS等宽自定义字体

rsl1atfo  于 2023-02-26  发布在  iOS
关注(0)|答案(3)|浏览(263)

我的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

不管有没有上面的代码,标签显示在适当的自定义字体。它只是上面的代码不做任何事情。

qgzx9mmu

qgzx9mmu1#

* 我下面的答案是仅将现有字体的数字(不是整个字体)设置为等宽(如果字体支持)*

至少我在寻找使数字等间距时找到了这个线程。所以我希望它会有帮助,虽然它回答了另一个问题。

在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.monospacedDigitFont

/// 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

4bbkushb

4bbkushb2#

您使用的代码没有使字体等宽。
这是调整字体渲染数字在等宽模式。所以所有与此字体的数字将有相同的宽度。
以下是4个标签的示例,1个标签使用自定义字体Docis Light,第2个标签为Docis Light,数字等宽,第3个标签为相同大小的系统字体,第4个标签为系统字体,数字等宽:

如您所见,这种自定义字体已经支持等宽数字特性,无需进行任何调整。
如果您需要使用等宽(不仅仅是数字)字体,您必须使用自定义等宽字体(设计为等宽),或者您可以使用内置的iOS等宽字体,如Courier或门洛(查看http://iosfonts.com/上所有可用的iOS字体)
这是它们在相同场景下的外观:

不管有没有调整,它们已经是等宽的,数字也是等宽的。
我在这里回答了类似的问题,也许,我应该只链接answer而不是图像,但它更直观。

wfauudbj

wfauudbj3#

不要忘记导入头文件。希望它能工作。这个解决方案是在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]];

相关问题