iOS моноширинный пользовательский шрифт

У меня есть собственный шрифт, включенный в мой целевой проект 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

С указанным выше кодом или без него метка отображается соответствующим шрифтом. Это просто выше кода ничего не делает.

2 ответа

Мой следующий ответ - это только числа (а не весь шрифт) существующего шрифта моноширинными (если шрифт его поддерживает)

По крайней мере, я искал сделать числа моноширинными, когда нашел эту тему. Так что я надеюсь, что это поможет, хотя и отвечает на другой вопрос.

Это прекрасно работает, протестировано на 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)

Код, который вы используете, не делает шрифт моноширинным.

Это настройка шрифта для рендеринга цифр в моноширинном режиме. Так что все с этим шрифтом цифры будут иметь одинаковую ширину.

Ниже приведен пример с 4 метками, 1 использует собственный шрифт Docis Light, 2-й - Docis Light с моноширинными цифрами, 3-й - системный шрифт того же размера, 4-й - системный шрифт с моноширинными цифрами:

моноширинный шрифт в ios

Как видите, этот нестандартный шрифт уже поддерживает моноширинную функцию цифр из коробки без необходимости подстройки.

Если вам нужно использовать моноширинный (а не только цифры) шрифт, вы должны использовать собственный моноширинный шрифт (предназначенный для моноширинного шрифта), или вы можете использовать встроенные моноширинные шрифты iOS, такие как Courier или Menlo (см. Все доступные шрифты iOS на http://iosfonts.com/)

Вот как они выглядят при одном сценарии:

моноширинные шрифты iOS для Courier и Menlo

С настройками или без них, они уже моноширинные, а цифры также моноширинные.

Я ответил на подобный вопрос здесь, вероятно, я должен просто связать ответ вместо изображений, но это намного более наглядно.

Не забудьте импортировать файл заголовка. Надеюсь, это сработает. Это решение в 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]];
Другие вопросы по тегам