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.
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 .
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)
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
]
]
]
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)
}
}
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)
}
}
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
}
}