iosuilabeluifontmonospaceios9

How to get monospaced numbers in UILabel on iOS 9


At WWDC 2015, there was a session about the new “San Francisco” system font in iOS 9. It uses proportional number rendering instead of monospaced numbers by default when linked against the iOS 9 SDK. There is a convenient initializer on NSFont called NSFont.monospacedDigitsSystemFontOfSize(mySize weight:) that can be used to explicitly enable monospaced number display.

However I couldn't find the UIKit equivalent for this on UIFont.


Solution

  • Handy UIFont extension:

    extension UIFont {
        var monospacedDigitFont: UIFont {
            let newFontDescriptor = fontDescriptor.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
        }
    }
    

    Usage with @IBOutlet properties:

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

    Latest version on GitHub.