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

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

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

6 Solutions collect form web for “Как получить моноширинные номера в UILabel на iOS 9”

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.

  • Подробнее / Меньше с Swift 3
  • Межстрочный интервал для UILabel с одной строкой текста
  • Вертикальный текст центра в UILabel в зависимости от фактической высоты видимой буквы
  • В UILabel можно ли заставить строку НЕ ломаться в определенном месте
  • Получите размер UILabel после программного программирования текста
  • Отрегулируйте высоту UILabel в зависимости от текста
  • Многострочный UILabel пропускает последнюю строку иногда iOS
  • Можно ли использовать NSBaselineOffsetAttributeName с TTTAttributedLabel?
  • Вставить текст в UILabel слева
  • Как настроить размер ярлыка, чтобы он соответствовал длине текста
  • Как запретить текстовую оболочку UITableViewCell обрезать текст на iPad
  • Interesting Posts

    Отслеживание использования / мониторинга данных iPhone

    iOS: метка специальных возможностей для CALayer

    Как быстро настроить контроллер просмотров на один из предыдущих контроллеров представления?

    Есть ли уведомление, отправленное, когда пользователь отменяет установку программы с помощью протокола itms-services

    Невозможно выполнить тесты из командной строки через xcodebuild

    UIBarButtonItem перемещается вниз после нажатия UINavigationController

    UIAlert в Swift, который автоматически исчезает?

    NSDate из строки

    Проблемы UITextField в iOS 5 путем изменения UITextFieldBorderStyle во время выполнения

    Использование waitUntilCompleted

    Ошибка локализации приложения в ios

    Как отключить бета-тестирование TestFlight?

    Как шифровать iOS-файлы (например, PDF-файлы) из пользовательского доступа?

    Создание токенов доступа к странице никогда не истекает с 2016 Facebook SDK?

    Что вызовет viewDidLayoutSubviews и будет искать хороший шаблон для инициализации кадра subviews

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.