ios - proporcionales - tipos de fuente para sublime text
Cómo obtener números monoespaciados en UILabel en iOS 9 (7)
Esto ya está disponible en UIFont
desde iOS 9:
+ (UIFont *)monospacedDigitSystemFontOfSize:(CGFloat)fontSize weight:(CGFloat)weight NS_AVAILABLE_IOS(9_0);
p.ej:
[UIFont monospacedDigitSystemFontOfSize:42.0 weight:UIFontWeightMedium];
o en Swift:
UIFont.monospacedDigitSystemFont(ofSize: 42.0, weight: UIFontWeightMedium)
En la WWDC 2015, hubo una sesión sobre la nueva fuente del sistema "San Francisco" en iOS 9. Utiliza la representación proporcional de números en lugar de números monoespaciados de forma predeterminada cuando se vincula con el iOS 9 SDK. Hay un inicializador conveniente en NSFont llamado NSFont.monospacedDigitsSystemFontOfSize(mySize weight:)
que se puede usar para habilitar explícitamente la visualización de números monoespaciados.
Sin embargo, no pude encontrar el equivalente de UIKit
para esto en UIFont
.
Ha habido bastante cambio de nombre en Swift 4, por lo que los atributos ahora se ven así:
let fontDescriptorAttributes = [
UIFontDescriptor.AttributeName.featureSettings: [
[
UIFontDescriptor.FeatureKey.featureIdentifier: kNumberSpacingType,
UIFontDescriptor.FeatureKey.typeIdentifier: kMonospacedNumbersSelector
]
]
]
La solución aceptada funciona muy bien, pero se estrelló con la optimización del compilador configurada en Rápida (por defecto para las versiones de lanzamiento) Reescribió el código de esta manera y ahora no lo hace:
extension UIFont
{
var monospacedDigitFont: UIFont
{
return UIFont(descriptor: fontDescriptor().fontDescriptorByAddingAttributes([UIFontDescriptorFeatureSettingsAttribute: [[UIFontFeatureTypeIdentifierKey: kNumberSpacingType, UIFontFeatureSelectorIdentifierKey: kMonospacedNumbersSelector]]]), size: 0)
}
}
Nota: El método en la respuesta actualmente aceptada ha comenzado a fallar en Xcode 7.3 (Swift 2.2), solo en las versiones de lanzamiento. La eliminación de la variable de extensión monospacedDigitFontDescriptor
intermedia soluciona el problema.
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)
}
}
O simplemente usa Helvetica. Todavía tiene números monoespaciados y funciona de forma retroactiva a versiones anteriores de iOS.
Una versión un poco mejorada del código de @Rudolf Adamkovic que comprueba la versión de iOS:
var monospacedDigitFont: UIFont {
if #available(iOS 9, *) {
let oldFontDescriptor = fontDescriptor()
let newFontDescriptor = oldFontDescriptor.monospacedDigitFontDescriptor
return UIFont(descriptor: newFontDescriptor, size: 0)
} else {
return self
}
}
UIFont
Handy 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
}
}
Uso con @IBOutlet
propiedades de @IBOutlet
:
@IBOutlet private var timeLabel: UILabel? {
didSet {
timeLabel.font = timeLabel.font.monospacedDigitFont
}
}
Última versión en GitHub .