En iOS7 hay nuevas API para obtener una fuente que se ajusta automáticamente al tamaño del texto que el usuario ha establecido en sus preferencias.
Se parece a esto para usarlo:
UIFont *myFont = [UIFont fontWithDescriptor:[UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleHeadline] size:0];
Ahora, cualquier texto al que asigne esto se moverá hacia arriba y hacia abajo en el tamaño de fuente a medida que el usuario cambie la configuración de tamaño de texto del sistema. (Recuerde escuchar la name:UIContentSizeCategoryDidChangeNotification
notificación y actualizar su vista para tener en cuenta el cambio de tamaño).
Respuestas:
Detrás de la escena de esa API, Apple tiene una especie de tabla de búsqueda que devuelve una familia de fuentes específica, tamaño y, a veces, rasgos simbólicos (como negrita) que (por ejemplo
UIFontTextStyleHeadline
) y el tamaño de texto preferido del usuario. Este último es una cuerda que se extrae desharedApplication
esta manera:[UIApplication sharedApplication].preferredContentSizeCategory;
(Cerré la sesión de todos los tamaños / fuentes / rasgos predeterminados para Helvetica-Neue para los distintos tamaños de texto dinámico). Desde entonces, agregamos manejo para los tamaños de accesibilidad, lo cual es importante .
Entonces, todo lo que tiene que hacer es crear una tabla de búsqueda similar. Nuestro diseñador creó una hoja de cálculo simple para mí:
Observe que agregamos un par de estilos (subtítulos 3 y 4) para tener 8 en lugar de 6 para elegir.
Entonces querrás ponerlo en un lugar conveniente, como una categoría
UIFontDescriptor
. Querrá que su método devuelva unaUIFontDescriptor
API similar a Apple, de modo que aún sea fácil de ajustar con rasgos simbólicos, etc.Mi categoría se ve así:
UIFontDescriptor + AvenirNext.h
#import <UIKit/UIKit.h> extern NSString *const ANUIFontTextStyleCaption3; @interface UIFontDescriptor (AvenirNext) +(UIFontDescriptor *)preferredAvenirNextFontDescriptorWithTextStyle:(NSString *)style; @end
UIFontDescriptor + AvenirNext.m
#import "UIFontDescriptor+AvenirNext.h" NSString *const ANUIFontTextStyleCaption3 = @"ANUIFontTextStyleCaption3"; NSString *const ANUIFontTextStyleCaption4 = @"ANUIFontTextStyleCaption4"; @implementation UIFontDescriptor (AvenirNext) +(UIFontDescriptor *)preferredAvenirNextFontDescriptorWithTextStyle:(NSString *)style { static dispatch_once_t onceToken; static NSDictionary *fontSizeTable; dispatch_once(&onceToken, ^{ fontSizeTable = @{ UIFontTextStyleHeadline: @{ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @26, UIContentSizeCategoryAccessibilityExtraExtraLarge: @25, UIContentSizeCategoryAccessibilityExtraLarge: @24, UIContentSizeCategoryAccessibilityLarge: @24, UIContentSizeCategoryAccessibilityMedium: @23, UIContentSizeCategoryExtraExtraExtraLarge: @23, UIContentSizeCategoryExtraExtraLarge: @22, UIContentSizeCategoryExtraLarge: @21, UIContentSizeCategoryLarge: @20, UIContentSizeCategoryMedium: @19, UIContentSizeCategorySmall: @18, UIContentSizeCategoryExtraSmall: @17,}, UIFontTextStyleSubheadline: @{ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @24, UIContentSizeCategoryAccessibilityExtraExtraLarge: @23, UIContentSizeCategoryAccessibilityExtraLarge: @22, UIContentSizeCategoryAccessibilityLarge: @22, UIContentSizeCategoryAccessibilityMedium: @21, UIContentSizeCategoryExtraExtraExtraLarge: @21, UIContentSizeCategoryExtraExtraLarge: @20, UIContentSizeCategoryExtraLarge: @19, UIContentSizeCategoryLarge: @18, UIContentSizeCategoryMedium: @17, UIContentSizeCategorySmall: @16, UIContentSizeCategoryExtraSmall: @15,}, UIFontTextStyleBody: @{ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @21, UIContentSizeCategoryAccessibilityExtraExtraLarge: @20, UIContentSizeCategoryAccessibilityExtraLarge: @19, UIContentSizeCategoryAccessibilityLarge: @19, UIContentSizeCategoryAccessibilityMedium: @18, UIContentSizeCategoryExtraExtraExtraLarge: @18, UIContentSizeCategoryExtraExtraLarge: @17, UIContentSizeCategoryExtraLarge: @16, UIContentSizeCategoryLarge: @15, UIContentSizeCategoryMedium: @14, UIContentSizeCategorySmall: @13, UIContentSizeCategoryExtraSmall: @12,}, UIFontTextStyleCaption1: @{ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @19, UIContentSizeCategoryAccessibilityExtraExtraLarge: @18, UIContentSizeCategoryAccessibilityExtraLarge: @17, UIContentSizeCategoryAccessibilityLarge: @17, UIContentSizeCategoryAccessibilityMedium: @16, UIContentSizeCategoryExtraExtraExtraLarge: @16, UIContentSizeCategoryExtraExtraLarge: @16, UIContentSizeCategoryExtraLarge: @15, UIContentSizeCategoryLarge: @14, UIContentSizeCategoryMedium: @13, UIContentSizeCategorySmall: @12, UIContentSizeCategoryExtraSmall: @12,}, UIFontTextStyleCaption2: @{ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @18, UIContentSizeCategoryAccessibilityExtraExtraLarge: @17, UIContentSizeCategoryAccessibilityExtraLarge: @16, UIContentSizeCategoryAccessibilityLarge: @16, UIContentSizeCategoryAccessibilityMedium: @15, UIContentSizeCategoryExtraExtraExtraLarge: @15, UIContentSizeCategoryExtraExtraLarge: @14, UIContentSizeCategoryExtraLarge: @14, UIContentSizeCategoryLarge: @13, UIContentSizeCategoryMedium: @12, UIContentSizeCategorySmall: @12, UIContentSizeCategoryExtraSmall: @11,}, ANUIFontTextStyleCaption3: @{ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @17, UIContentSizeCategoryAccessibilityExtraExtraLarge: @16, UIContentSizeCategoryAccessibilityExtraLarge: @15, UIContentSizeCategoryAccessibilityLarge: @15, UIContentSizeCategoryAccessibilityMedium: @14, UIContentSizeCategoryExtraExtraExtraLarge: @14, UIContentSizeCategoryExtraExtraLarge: @13, UIContentSizeCategoryExtraLarge: @12, UIContentSizeCategoryLarge: @12, UIContentSizeCategoryMedium: @12, UIContentSizeCategorySmall: @11, UIContentSizeCategoryExtraSmall: @10,}, UIFontTextStyleFootnote: @{ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @16, UIContentSizeCategoryAccessibilityExtraExtraLarge: @15, UIContentSizeCategoryAccessibilityExtraLarge: @14, UIContentSizeCategoryAccessibilityLarge: @14, UIContentSizeCategoryAccessibilityMedium: @13, UIContentSizeCategoryExtraExtraExtraLarge: @13, UIContentSizeCategoryExtraExtraLarge: @12, UIContentSizeCategoryExtraLarge: @12, UIContentSizeCategoryLarge: @11, UIContentSizeCategoryMedium: @11, UIContentSizeCategorySmall: @10, UIContentSizeCategoryExtraSmall: @10,}, ANUIFontTextStyleCaption4: @{ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @15, UIContentSizeCategoryAccessibilityExtraExtraLarge: @14, UIContentSizeCategoryAccessibilityExtraLarge: @13, UIContentSizeCategoryAccessibilityLarge: @13, UIContentSizeCategoryAccessibilityMedium: @12, UIContentSizeCategoryExtraExtraExtraLarge: @12, UIContentSizeCategoryExtraExtraLarge: @11, UIContentSizeCategoryExtraLarge: @11, UIContentSizeCategoryLarge: @10, UIContentSizeCategoryMedium: @10, UIContentSizeCategorySmall: @9, UIContentSizeCategoryExtraSmall: @9,}, }; }); NSString *contentSize = [UIApplication sharedApplication].preferredContentSizeCategory; return [UIFontDescriptor fontDescriptorWithName:[self preferredFontName] size:((NSNumber *)fontSizeTable[style][contentSize]).floatValue]; } +(UIFontDescriptor *)preferredAvenirNextDemiBoldFontDescriptorWithTextStyle:(NSString *)style { return [[self preferredAvenirNextFontDescriptorWithTextStyle:style] fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold]; } +(UIFontDescriptor *)preferredAvenirNextBoldFontDescriptorWithTextStyle:(NSString *)style { return [UIFontDescriptor fontDescriptorWithName:[self preferredBoldFontName] size:[self preferredAvenirNextFontDescriptorWithTextStyle:style].pointSize]; } +(NSString *)preferredFontName { return @"AvenirNext-Medium"; } +(NSString *)preferredBoldFontName { return @"AvenirNext-Bold"; } @end
Elegimos usar la misma fuente base
AvenirNext-Medium
, y luego negrita y demás a través de rasgos simbólicos, pero podría volverse loco y especificar diferentes variantes de peso en su fuente como parte de su tabla de búsqueda también si lo deseaAvenirNext-ExtraBold
.¡Eso es todo al respecto! Lo usamos así:
[UIFont fontWithDescriptor:[UIFontDescriptor preferredAvenirNextFontDescriptorWithTextStyle:UIFontTextStyleHeadline] size: 0]
fuente
UIContentSizeCategoryAccessibilityMedium
,UIContentSizeCategoryAccessibilityLarge
, etc.UIFont
, para que pueda usar[UIFont preferredAvenirFontForTextStyle:UIFontTextStyleHeadline]
:? ¿El tamaño es redundante en el ejemplo que da al final?Así es como lo hago en Swift. Me gusta esto porque es más general, solo requiere una tabla y debería funcionar bien con cualquier fuente. Primero escribí un multiplicador generalizado (en un captador).
var fontSizeMultiplier : CGFloat { get { switch UIApplication.sharedApplication().preferredContentSizeCategory { case UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: return 23 / 16 case UIContentSizeCategoryAccessibilityExtraExtraLarge: return 22 / 16 case UIContentSizeCategoryAccessibilityExtraLarge: return 21 / 16 case UIContentSizeCategoryAccessibilityLarge: return 20 / 16 case UIContentSizeCategoryAccessibilityMedium: return 19 / 16 case UIContentSizeCategoryExtraExtraExtraLarge: return 19 / 16 case UIContentSizeCategoryExtraExtraLarge: return 18 / 16 case UIContentSizeCategoryExtraLarge: return 17 / 16 case UIContentSizeCategoryLarge: return 1.0 case UIContentSizeCategoryMedium: return 15 / 16 case UIContentSizeCategorySmall: return 14 / 16 case UIContentSizeCategoryExtraSmall: return 13 / 16 default: return 1.0 } } }
Luego actualizo la fuente (por ejemplo, en el observador) usando una
UIFontDescriptor
como esta:textView.font = UIFont(descriptor: fontDescriptor!, size: fontDescriptor!.pointSize * fontSizeMultiplier)
fuente
En iOS
UIFontMetrics
se introdujo la clase 11 . Cree un objeto FontMetrics para el estilo de texto que le interesa. Luego, elija la fuente que desee, con el tamaño del tipo de letra dinámico estándar. Y luego puede pedirle al objeto FontMetrics que escale esa fuente dada la configuración actual del usuario.let bodyMetrics = UIFontMetrics(forTextStyle: .body) let standardFont = ... // any font you want, for standard type size let font = bodyMetrics.scaledFont(for: standardFont)
fuente
Código de @Bob Spryn reescrito con rapidez:
import UIKit extension UIFontDescriptor { private struct SubStruct { static var preferredFontName: NSString = "OEMeodedPashutPro-Regular" } class func preferredDescriptor(textStyle: NSString) -> UIFontDescriptor { struct Static { static var onceToken : dispatch_once_t = 0 static var fontSizeTable : NSDictionary = NSDictionary() } dispatch_once(&Static.onceToken) { Static.fontSizeTable = [ UIFontTextStyleHeadline: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 26, UIContentSizeCategoryAccessibilityExtraExtraLarge: 25, UIContentSizeCategoryAccessibilityExtraLarge: 24, UIContentSizeCategoryAccessibilityLarge: 24, UIContentSizeCategoryAccessibilityMedium: 23, UIContentSizeCategoryExtraExtraExtraLarge: 23, UIContentSizeCategoryExtraExtraLarge: 22, UIContentSizeCategoryExtraLarge: 21, UIContentSizeCategoryLarge: 20, UIContentSizeCategoryMedium: 19, UIContentSizeCategorySmall: 18, UIContentSizeCategoryExtraSmall: 17 ], UIFontTextStyleSubheadline: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 24, UIContentSizeCategoryAccessibilityExtraExtraLarge: 23, UIContentSizeCategoryAccessibilityExtraLarge: 22, UIContentSizeCategoryAccessibilityLarge: 22, UIContentSizeCategoryAccessibilityMedium: 21, UIContentSizeCategoryExtraExtraExtraLarge: 21, UIContentSizeCategoryExtraExtraLarge: 20, UIContentSizeCategoryExtraLarge: 19, UIContentSizeCategoryLarge: 18, UIContentSizeCategoryMedium: 17, UIContentSizeCategorySmall: 16, UIContentSizeCategoryExtraSmall: 15 ], UIFontTextStyleBody: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 21, UIContentSizeCategoryAccessibilityExtraExtraLarge: 20, UIContentSizeCategoryAccessibilityExtraLarge: 19, UIContentSizeCategoryAccessibilityLarge: 19, UIContentSizeCategoryAccessibilityMedium: 18, UIContentSizeCategoryExtraExtraExtraLarge: 18, UIContentSizeCategoryExtraExtraLarge: 17, UIContentSizeCategoryExtraLarge: 16, UIContentSizeCategoryLarge: 15, UIContentSizeCategoryMedium: 14, UIContentSizeCategorySmall: 13, UIContentSizeCategoryExtraSmall: 12 ], UIFontTextStyleCaption1: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 19, UIContentSizeCategoryAccessibilityExtraExtraLarge: 18, UIContentSizeCategoryAccessibilityExtraLarge: 17, UIContentSizeCategoryAccessibilityLarge: 17, UIContentSizeCategoryAccessibilityMedium: 16, UIContentSizeCategoryExtraExtraExtraLarge: 16, UIContentSizeCategoryExtraExtraLarge: 16, UIContentSizeCategoryExtraLarge: 15, UIContentSizeCategoryLarge: 14, UIContentSizeCategoryMedium: 13, UIContentSizeCategorySmall: 12, UIContentSizeCategoryExtraSmall: 12 ], UIFontTextStyleCaption2: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 18, UIContentSizeCategoryAccessibilityExtraExtraLarge: 17, UIContentSizeCategoryAccessibilityExtraLarge: 16, UIContentSizeCategoryAccessibilityLarge: 16, UIContentSizeCategoryAccessibilityMedium: 15, UIContentSizeCategoryExtraExtraExtraLarge: 15, UIContentSizeCategoryExtraExtraLarge: 14, UIContentSizeCategoryExtraLarge: 14, UIContentSizeCategoryLarge: 13, UIContentSizeCategoryMedium: 12, UIContentSizeCategorySmall: 12, UIContentSizeCategoryExtraSmall: 11 ], UIFontTextStyleFootnote: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 16, UIContentSizeCategoryAccessibilityExtraExtraLarge: 15, UIContentSizeCategoryAccessibilityExtraLarge: 14, UIContentSizeCategoryAccessibilityLarge: 14, UIContentSizeCategoryAccessibilityMedium: 13, UIContentSizeCategoryExtraExtraExtraLarge: 13, UIContentSizeCategoryExtraExtraLarge: 12, UIContentSizeCategoryExtraLarge: 12, UIContentSizeCategoryLarge: 11, UIContentSizeCategoryMedium: 11, UIContentSizeCategorySmall: 10, UIContentSizeCategoryExtraSmall: 10 ], ] } let contentSize = UIApplication.sharedApplication().preferredContentSizeCategory let style = Static.fontSizeTable[textStyle] as NSDictionary return UIFontDescriptor(name: SubStruct.preferredFontName, size: CGFloat((style[contentSize] as NSNumber).floatValue)) } }
Uso:
UIFont(descriptor: UIFontDescriptor.preferredDescriptor(UIFontTextStyleBody), size: 0)
fuente
let style = Static.fontSizeTable[textStyle] as! NSDictionary
yreturn UIFontDescriptor(name: SubStruct.preferredFontName as String, size: CGFloat((style[contentSize] as! NSNumber).floatValue))
Prueba esto:
UIFontDescriptor *userHeadLineFont = [UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleHeadline]; CGFloat userHeadLineFontSize = [userHeadLineFont pointSize]; myFont = [UIFont fontWithName:@"Baskerville" size:userHeadLineFontSize];
Pero tenga en cuenta que este código es solo una aproximación (Dynamic Type hace mucho más que escalar el tamaño de fuente).
fuente
Similar al enfoque de @ bill-weinman , tomé las escalas y las dividí en una función que no depende de un tamaño de fuente dado de 16.
/// The font scale for a given font size. /// /// - seealso: [Source](https://stackoverflow.com/a/33114525/3643020) /// /// - Parameter fontSize: The font size. /// - Returns: The font scale public func fontScale(for fontSize: CGFloat) -> CGFloat { switch UIApplication.shared.preferredContentSizeCategory { case UIContentSizeCategory.accessibilityExtraExtraExtraLarge: return (fontSize + 8) / fontSize case UIContentSizeCategory.accessibilityExtraExtraLarge: return (fontSize + 7) / fontSize case UIContentSizeCategory.accessibilityExtraLarge: return (fontSize + 6) / fontSize case UIContentSizeCategory.accessibilityLarge: return (fontSize + 5) / fontSize case UIContentSizeCategory.accessibilityMedium: return (fontSize + 4) / fontSize case UIContentSizeCategory.extraExtraExtraLarge: return (fontSize + 3) / fontSize case UIContentSizeCategory.extraExtraLarge: return (fontSize + 2) / fontSize case UIContentSizeCategory.extraLarge: return (fontSize + 1) / fontSize case UIContentSizeCategory.large: return 1.0 case UIContentSizeCategory.medium: return (fontSize - 1) / fontSize case UIContentSizeCategory.small: return (fontSize - 2) / fontSize case UIContentSizeCategory.extraSmall: return (fontSize - 3) / fontSize default: return 1.0 } }
Luego se puede usar con fuentes personalizadas como esta:
/// Light font of specified size. /// /// - Parameter size: Font size. /// - Returns: Light font of specified size. func lightFont(ofSize size: CGFloat) -> UIFont { let scaledSize = size * fontScale(for: size) return UIFont(name: "HelveticaNeueLTStd-Lt", size: scaledSize)! }
fuente
En iOS 11 puedes usar:
var customFont = UIFont.systemFont(ofSize: 17.0) if #available(iOS 11.0, *) { customFont = UIFontMetrics.default.scaledFont(for: customFont) } // use customFont...
Consulte también Creación de aplicaciones con tipo dinámico WWDC 2017 - Sesión 245 - Hora de iOS 8:34.
fuente
Código Swift 2.1-3.0 basado en el puerto de @ smartDonkey del código @Bob Spryn. También actualizado con los tamaños de Apple de @Klaas .
import UIKit extension UIFontDescriptor { private struct SubStruct { static var preferredFontName: String = "Roboto-Light" } class func preferredDescriptor(textStyle: NSString) -> UIFontDescriptor { struct Static { static var onceToken : dispatch_once_t = 0 static var fontSizeTable : NSDictionary = NSDictionary() } dispatch_once(&Static.onceToken) { Static.fontSizeTable = [ UIFontTextStyleHeadline: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 23, UIContentSizeCategoryAccessibilityExtraExtraLarge: 23, UIContentSizeCategoryAccessibilityExtraLarge: 23, UIContentSizeCategoryAccessibilityLarge: 23, UIContentSizeCategoryAccessibilityMedium: 23, UIContentSizeCategoryExtraExtraExtraLarge: 23, UIContentSizeCategoryExtraExtraLarge: 21, UIContentSizeCategoryExtraLarge: 19, UIContentSizeCategoryLarge: 17, UIContentSizeCategoryMedium: 16, UIContentSizeCategorySmall: 15, UIContentSizeCategoryExtraSmall: 14 ], UIFontTextStyleSubheadline: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 21, UIContentSizeCategoryAccessibilityExtraExtraLarge: 21, UIContentSizeCategoryAccessibilityExtraLarge: 21, UIContentSizeCategoryAccessibilityLarge: 21, UIContentSizeCategoryAccessibilityMedium: 21, UIContentSizeCategoryExtraExtraExtraLarge: 21, UIContentSizeCategoryExtraExtraLarge: 19, UIContentSizeCategoryExtraLarge: 17, UIContentSizeCategoryLarge: 15, UIContentSizeCategoryMedium: 14, UIContentSizeCategorySmall: 13, UIContentSizeCategoryExtraSmall: 12 ], UIFontTextStyleBody: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 53, UIContentSizeCategoryAccessibilityExtraExtraLarge: 47, UIContentSizeCategoryAccessibilityExtraLarge: 40, UIContentSizeCategoryAccessibilityLarge: 33, UIContentSizeCategoryAccessibilityMedium: 28, UIContentSizeCategoryExtraExtraExtraLarge: 23, UIContentSizeCategoryExtraExtraLarge: 21, UIContentSizeCategoryExtraLarge: 19, UIContentSizeCategoryLarge: 17, UIContentSizeCategoryMedium: 16, UIContentSizeCategorySmall: 15, UIContentSizeCategoryExtraSmall: 14 ], UIFontTextStyleCaption1: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 18, UIContentSizeCategoryAccessibilityExtraExtraLarge: 18, UIContentSizeCategoryAccessibilityExtraLarge: 18, UIContentSizeCategoryAccessibilityLarge: 18, UIContentSizeCategoryAccessibilityMedium: 18, UIContentSizeCategoryExtraExtraExtraLarge: 18, UIContentSizeCategoryExtraExtraLarge: 16, UIContentSizeCategoryExtraLarge: 14, UIContentSizeCategoryLarge: 12, UIContentSizeCategoryMedium: 11, UIContentSizeCategorySmall: 11, UIContentSizeCategoryExtraSmall: 11 ], UIFontTextStyleCaption2: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 17, UIContentSizeCategoryAccessibilityExtraExtraLarge: 17, UIContentSizeCategoryAccessibilityExtraLarge: 17, UIContentSizeCategoryAccessibilityLarge: 17, UIContentSizeCategoryAccessibilityMedium: 17, UIContentSizeCategoryExtraExtraExtraLarge: 17, UIContentSizeCategoryExtraExtraLarge: 15, UIContentSizeCategoryExtraLarge: 13, UIContentSizeCategoryLarge: 11, UIContentSizeCategoryMedium: 11, UIContentSizeCategorySmall: 11, UIContentSizeCategoryExtraSmall: 11 ], UIFontTextStyleFootnote: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 19, UIContentSizeCategoryAccessibilityExtraExtraLarge: 19, UIContentSizeCategoryAccessibilityExtraLarge: 19, UIContentSizeCategoryAccessibilityLarge: 19, UIContentSizeCategoryAccessibilityMedium: 19, UIContentSizeCategoryExtraExtraExtraLarge: 19, UIContentSizeCategoryExtraExtraLarge: 17, UIContentSizeCategoryExtraLarge: 15, UIContentSizeCategoryLarge: 13, UIContentSizeCategoryMedium: 12, UIContentSizeCategorySmall: 12, UIContentSizeCategoryExtraSmall: 12 ], ] } let contentSize = UIApplication.sharedApplication().preferredContentSizeCategory let style = Static.fontSizeTable[textStyle] as! NSDictionary return UIFontDescriptor(name: SubStruct.preferredFontName, size: CGFloat((style[contentSize] as! NSNumber).floatValue)) } }
fuente
'dispatch_once_t' is unavailable in Swift: Use lazily initialized globals instead
Aquí está mi opinión sobre la respuesta de @ Gobe, en Swift 3:
extension UIFontDescriptor { @nonobjc static var fontSizeTable: [UIFontTextStyle : [UIContentSizeCategory : CGFloat]] = { return [ .headline: [ .accessibilityExtraExtraExtraLarge: 23, .accessibilityExtraExtraLarge: 23, .accessibilityExtraLarge: 23, .accessibilityLarge: 23, .accessibilityMedium: 23, .extraExtraExtraLarge: 23, .extraExtraLarge: 21, .extraLarge: 19, .large: 17, .medium: 16, .small: 15, .extraSmall: 14], .subheadline: [ .accessibilityExtraExtraExtraLarge: 21, .accessibilityExtraExtraLarge: 21, .accessibilityExtraLarge: 21, .accessibilityLarge: 21, .accessibilityMedium: 21, .extraExtraExtraLarge: 21, .extraExtraLarge: 19, .extraLarge: 17, .large: 15, .medium: 14, .small: 13, .extraSmall: 12], .body: [ .accessibilityExtraExtraExtraLarge: 53, .accessibilityExtraExtraLarge: 47, .accessibilityExtraLarge: 40, .accessibilityLarge: 33, .accessibilityMedium: 28, .extraExtraExtraLarge: 23, .extraExtraLarge: 21, .extraLarge: 19, .large: 17, .medium: 16, .small: 15, .extraSmall: 14], .caption1: [ .accessibilityExtraExtraExtraLarge: 18, .accessibilityExtraExtraLarge: 18, .accessibilityExtraLarge: 18, .accessibilityLarge: 18, .accessibilityMedium: 18, .extraExtraExtraLarge: 18, .extraExtraLarge: 16, .extraLarge: 14, .large: 12, .medium: 11, .small: 11, .extraSmall: 11], .caption2: [ .accessibilityExtraExtraExtraLarge: 17, .accessibilityExtraExtraLarge: 17, .accessibilityExtraLarge: 17, .accessibilityLarge: 17, .accessibilityMedium: 17, .extraExtraExtraLarge: 17, .extraExtraLarge: 15, .extraLarge: 13, .large: 11, .medium: 11, .small: 11, .extraSmall: 11], .footnote: [ .accessibilityExtraExtraExtraLarge: 19, .accessibilityExtraExtraLarge: 19, .accessibilityExtraLarge: 19, .accessibilityLarge: 19, .accessibilityMedium: 19, .extraExtraExtraLarge: 19, .extraExtraLarge: 17, .extraLarge: 15, .large: 13, .medium: 12, .small: 12, .extraSmall: 12], ] }() class func currentPreferredSize(textStyle: UIFontTextStyle = .body) -> CGFloat { let contentSize = UIApplication.shared.preferredContentSizeCategory guard let style = fontSizeTable[textStyle], let fontSize = style[contentSize] else { return 17 } return fontSize } class func preferredFontDescriptor(fontName: String = "SnellRoundhand", textStyle: UIFontTextStyle = .body) -> UIFontDescriptor { return UIFontDescriptor(name: fontName, size: currentPreferredSize()) } }
fuente
Así es como actualizo la fuente de un prefferedFontForTextStyle:
UIFont *font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; UIFontDescriptor *fontDesc = [font fontDescriptor]; fontDesc = [fontDesc fontDescriptorByAddingAttributes:@{UIFontDescriptorNameAttribute : @"Helvetica", UIFontDescriptorSizeAttribute : @16}]; font = [UIFont fontWithDescriptor:fontDesc size:[fontDesc pointSize]];
fuente
Solo quería saltar y decir que hay una biblioteca para ayudar a integrar fuentes personalizadas y lidiar con los cambios de tamaño de Dynamic Type. Se llama, amablemente, Font ( https://github.com/adamyanalunas/Font ) y en lugar de ser una solución mágica, establece una estructura para manejar cada fuente personalizada de manera diferente mientras se elimina el texto estándar.
nb soy el autor de esta pequeña biblioteca y creo que es genial.
fuente
A partir de iOS 11, puede ajustar mediante programación las fuentes personalizadas configuradas en el editor visual:
@IBOutlet weak var leftLangLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() leftLangLabel.font = UIFontMetrics.default.scaledFont(for: leftLangLabel.font) }
fuente