Как получить моноширинные номера в UILabel на iOS 9

На WWDC 2015 была сессия о новом системном шрифте «Сан-Франциско» в iOS 9. Он использует рендеринг пропорционального числа вместо моноширинных номеров по умолчанию при соединении с iOS 9 SDK. В NSFont есть удобный инициализатор под названием NSFont.monospacedDigitsSystemFontOfSize(mySize weight:) который можно использовать для явного включения отображения моноширинного номера.

Однако я не мог найти эквивалент UIKit для этого в UIFont .

UIFont расширение UIFont :

 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 = [[UIFontFeatureTypeIdentifierKey: kNumberSpacingType, UIFontFeatureSelectorIdentifierKey: kMonospacedNumbersSelector]] let fontDescriptorAttributes = [UIFontDescriptorFeatureSettingsAttribute: fontDescriptorFeatureSettings] let fontDescriptor = self.fontDescriptorByAddingAttributes(fontDescriptorAttributes) return fontDescriptor } } 

Использование свойств @IBOutlet :

 @IBOutlet private var timeLabel: UILabel? { didSet { timeLabel.font = timeLabel.font.monospacedDigitFont } } 

Последняя версия на GitHub .

Это теперь доступно в UIFont с iOS 9:

 + (UIFont *)monospacedDigitSystemFontOfSize:(CGFloat)fontSize weight:(CGFloat)weight NS_AVAILABLE_IOS(9_0); 

например:

 [UIFont monospacedDigitSystemFontOfSize:42.0 weight:UIFontWeightMedium]; 

или в Свифт:

 UIFont.monospacedDigitSystemFont(ofSize: 42.0, weight: UIFontWeightMedium) 

Принятое решение отлично работает, но сработало с оптимизацией компилятора, установленной в Fast (по умолчанию для версий Release). Переписал код, как это, и теперь это не так:

 extension UIFont { var monospacedDigitFont: UIFont { return UIFont(descriptor: fontDescriptor().fontDescriptorByAddingAttributes([UIFontDescriptorFeatureSettingsAttribute: [[UIFontFeatureTypeIdentifierKey: kNumberSpacingType, UIFontFeatureSelectorIdentifierKey: kMonospacedNumbersSelector]]]), size: 0) } } 

Примечание. Метод в принятом в настоящее время ответе начал сбой для меня в Xcode 7.3 (Swift 2.2), только в версиях Release. Устранение промежуточной monospacedDigitFontDescriptor расширения monospacedDigitFontDescriptor устраняет проблему.

 extension UIFont { var monospacedDigitFont: UIFont { let fontDescriptorFeatureSettings = [[UIFontFeatureTypeIdentifierKey: kNumberSpacingType, UIFontFeatureSelectorIdentifierKey: kMonospacedNumbersSelector]] let fontDescriptorAttributes = [UIFontDescriptorFeatureSettingsAttribute: fontDescriptorFeatureSettings] let oldFontDescriptor = fontDescriptor() let newFontDescriptor = oldFontDescriptor.fontDescriptorByAddingAttributes(fontDescriptorAttributes) return UIFont(descriptor: newFontDescriptor, size: 0) } } 

Немного улучшена версия кода @Rudolf Adamkovic, которая проверяет версию iOS:

 var monospacedDigitFont: UIFont { if #available(iOS 9, *) { let oldFontDescriptor = fontDescriptor() let newFontDescriptor = oldFontDescriptor.monospacedDigitFontDescriptor return UIFont(descriptor: newFontDescriptor, size: 0) } else { return self } } 

Или просто используйте Helvetica. Он по-прежнему имеет моноширинные номера и ретроактивно работает с более старой версией iOS.

  • Получите Int из UILabel Swift
  • Проблема рендеринга UILabel с использованием boundingRectWithSize в iOS 7.0.3
  • Анимационный шрифт изменения UILabel
  • UILabel не будет переносить слова в UIScrollView с помощью AutoLayout
  • iOS: алгоритм для центрирования слова в предложении внутри UILabel
  • UILabel: цвет, зависящий от фона
  • Обновите предпочтительнуюMaxLayoutWidth для многострочного UILabel с неизвестным размером (Auto Layout)
  • UILabel с задними пробелами не центрируется должным образом
  • Минимальный размер шрифта, устаревший на версии ios 6.0
  • Как подождать в Objective-C
  • UILabel неправильно переносит слова в iOS 11
  • Давайте будем гением компьютера.