Cómo usar una fuente personalizada con tamaños de texto dynamics en iOS7

En iOS7 hay nuevas API para obtener una fuente que se ajusta automáticamente al tamaño de texto que el usuario ha establecido en sus preferencias.

Se ve algo así para usarlo:

UIFont *myFont = [UIFont fontWithDescriptor:[UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleHeadline] size:0]; 

Ahora, cualquier texto al que le asigne esto se moverá hacia arriba y hacia abajo en el tamaño de la fuente a medida que el usuario cambie la configuración del tamaño del texto del sistema. (Recuerde escuchar el name:UIContentSizeCategoryDidChangeNotification notificación y actualice su vista para dar cuenta del cambio de tamaño).

¿Cómo uso el texto dynamic con una fuente que no sea la Helvetica-Neue predeterminada?

Detrás de las escenas de esa API, Apple tiene algún tipo de tabla de búsqueda que devuelve una familia de fonts, tamaños y, a veces, rasgos simbólicos (como negrita) UIFontTextStyleHeadline (por ejemplo, UIFontTextStyleHeadline ) y el tamaño de texto preferido del usuario. Este último es una cadena extraída de la aplicación sharedApplication esta manera:

 [UIApplication sharedApplication].preferredContentSizeCategory; 

(Cerré todos los tamaños / fonts / rasgos predeterminados para Helvetica-Neue para los diversos tamaños de texto dynamic). Desde entonces, hemos agregado el manejo de los tamaños de accesibilidad, lo cual es importante .

Entonces, todo lo que tienes que hacer es crear una tabla de búsqueda similar. Nuestro diseñador creó una hoja de cálculo simple para mí:

Tabla de búsqueda de tamaño de fuente

Tenga en cuenta que añadimos un par de estilos (leyendas 3 y 4) para tener 8 en lugar de 6 para elegir.

Entonces querrá ponerlo en un lugar conveniente, como una categoría en UIFontDescriptor . UIFontDescriptor su método devuelva un UIFontDescriptor como la API de Apple, de modo que todavía sea fácil de ajustar con rasgos simbólicos, etc.

Mi categoría se ve así:

UIFontDescriptor + AvenirNext.h

 #import  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 utilizar la misma fuente base AvenirNext-Medium , y luego negrita y tal a través de rasgos simbólicos, pero podría volverse loco y especificar diferentes variantes de ponderación en su fuente como parte de su tabla de búsqueda si así lo deseara, como AvenirNext-ExtraBold .

¡Eso es todo al respecto! Lo usamos así:

 [UIFont fontWithDescriptor:[UIFontDescriptor preferredAvenirNextFontDescriptorWithTextStyle:UIFontTextStyleHeadline] size: 0] 

Así es como lo hago en Swift. Me gusta porque es más general, solo requiere una tabla, y debería funcionar bien con cualquier fuente. Primero escribí un multiplicador generalizado (en un getter).

 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 un UIFontDescriptor como este:

 textView.font = UIFont(descriptor: fontDescriptor!, size: fontDescriptor!.pointSize * fontSizeMultiplier) 

@Bob Spryn código reescrito con swift:

 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) 

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 simplemente escalar el tamaño de la fuente).

En iOS 11, se introdujo la clase UIFontMetrics . Cree un objeto FontMetrics para el estilo de texto que le interese. Luego, elija la fuente que desee, con el tamaño para el tamaño de tipo dynamic 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) 

De forma 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 fonts 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)! } 

Swift 2.1-3.0 código basado en el puerto de @ smartDonkey del código @Bob Spryn. También se actualizó 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)) } } 

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]]; 

Solo quería saltar y decir que hay una biblioteca para ayudar a integrar fonts personalizadas y lidiar con los cambios de tamaño de tipo dynamic. 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 al eliminar el texto repetitivo.

nb Soy el autor de esta pequeña biblioteca y creo que es genial.

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

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 Crear aplicaciones con tipo dynamic WWDC 2017 – Session 245 – Hora de iOS 8:34.