webentwicklung-frage-antwort-db.com.de

So erhalten Sie einheitliche Nummern in UILabel unter iOS 9

Auf der WWDC 2015 gab es eine Sitzung über die neue Systemschriftart "San Francisco" in iOS 9. Bei der Verknüpfung mit dem iOS 9-SDK wird standardmäßig eine proportionale Darstellung anstelle von Monopaced-Zahlen verwendet. Auf NSFont gibt es einen praktischen Initialisierer mit dem Namen NSFont.monospacedDigitsSystemFontOfSize(mySize weight:), mit dem explizit die Anzeige einer einfachen Nummer aktiviert werden kann.

Ich konnte jedoch nicht das UIKit-Äquivalent auf UIFont finden.

27
Samuel Mellert

Praktische UIFont-Erweiterung:

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

Verwendung mit @IBOutlet-Eigenschaften:

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

Neueste Version auf GitHub .

38

Dies ist jetzt in UIFont seit iOS 9 verfügbar:

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

z.B:

[UIFont monospacedDigitSystemFontOfSize:42.0 weight:UIFontWeightMedium];

oder in Swift:

UIFont.monospacedDigitSystemFont(ofSize: 42.0, weight: UIFontWeightMedium)
47
Ric Santos

In Swift 4 wurden einige Umbenennungen vorgenommen, sodass die Attribute jetzt wie folgt aussehen:

    let fontDescriptorAttributes = [
        UIFontDescriptor.AttributeName.featureSettings: [
            [
                UIFontDescriptor.FeatureKey.featureIdentifier: kNumberSpacingType,
                UIFontDescriptor.FeatureKey.typeIdentifier: kMonospacedNumbersSelector
            ]
        ]
    ]
5
samwize

Die akzeptierte Lösung funktioniert gut, stürzte jedoch ab, wobei die Compileroptimierung auf Schnell eingestellt war (Standard für Release-Builds). Schreibe den Code so um und jetzt nicht mehr:

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

Hinweis: Die Methode in der aktuell akzeptierten Antwort ist in Xcode 7.3 (Swift 2.2) für mich abgestürzt, nur in Release-Builds. Durch das Entfernen der Zwischenvariablenvariable monospacedDigitFontDescriptor wird das Problem behoben.

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)
    }
}
2
Jawwad

Eine etwas verbesserte Version des @Rudolf Adamkovic-Codes, der die iOS-Version überprüft:

var monospacedDigitFont: UIFont {

    if #available(iOS 9, *) {
        let oldFontDescriptor = fontDescriptor()
        let newFontDescriptor = oldFontDescriptor.monospacedDigitFontDescriptor

        return UIFont(descriptor: newFontDescriptor, size: 0)
    } else {
       return self
    }
}
0
OgreSwamp