ios7 uifont uifontdescriptor uifontweighttrait

ios7 - UIFontWeightTrait y UIFontDescriptorFamilyAttribute Omitido al crear UIFont desde UIFontDescriptor



(3)

Cuando se busca una fuente en negrita o cursiva, los rasgos simbólicos, al menos, parecen ser respetados. Así que esto funciona muy bien:

+ (UIFont*)fontWithFamily:(NSString*)family bold:(BOOL)bold italic:(BOOL)italic size:(CGFloat)pointSize { UIFontDescriptorSymbolicTraits traits = 0; if (bold) traits |= UIFontDescriptorTraitBold; if (italic) traits |= UIFontDescriptorTraitItalic; UIFontDescriptor* fd = [UIFontDescriptor fontDescriptorWithFontAttributes:@{UIFontDescriptorFamilyAttribute: family, UIFontDescriptorTraitsAttribute: @{UIFontSymbolicTrait: [NSNumber numberWithInteger:traits]}}]; NSArray* matches = [fd matchingFontDescriptorsWithMandatoryKeys: [NSSet setWithObjects:UIFontDescriptorFamilyAttribute, UIFontDescriptorTraitsAttribute, nil]]; if (matches.count == 0) return nil; return [UIFont fontWithDescriptor:matches[0] size:pointSize]; }

por ejemplo, [MyClass fontWithFamily:@"Avenir Next Condensed" bold:YES italic:NO size:12.0f];

No creo que esto ayude al OP, que buscaba específicamente una fuente ligera con UIFontWeightTrait , pero puede ayudar a otros con problemas similares.

Dado el siguiente código y un dispositivo que ejecuta iOS 7.1 o posterior:

NSDictionary *fontTraitsDictionary = @{UIFontWeightTrait : @(-1.0)}; NSDictionary *attributesDictionary = @{ UIFontDescriptorFamilyAttribute : @"Helvetica Neue", UIFontDescriptorTraitsAttribute : fontTraitsDictionary }; UIFontDescriptor *ultraLightDescriptor = [UIFontDescriptor fontDescriptorWithFontAttributes:attributesDictionary]; UIFont *shouldBeAnUltraLightFont = [UIFont fontWithDescriptor:ultraLightDescriptor size:24]; NSLog(@"%@", shouldBeAnUltraLightFont);

Espero que el valor de shouldBeAnUltraLightFont sea ​​una instancia de HelveticaNeue-UltraLight, pero en cambio es:

<UICTFont: 0x908d160> font-family: "Helvetica"; font-weight: normal; font-style: normal; font-size: 24.00pt

Estoy siguiendo la documentación de Apple hasta donde la entiendo. ¿Por qué la familia de fuentes y la información del peso de la fuente se ignoran por completo?

Cosas que he probado

  • He probado otros nombres de familia como Helvetica, Avenir, etc.
  • He probado otros pesos de fuente en el rango válido de -1 a 1 , en incrementos de 0.25

Independientemente de estos cambios, la fuente que se devuelve siempre es una instancia falsa de Helvetica con un peso normal.


Me encontré con el mismo problema, y ​​la documentación no fue de mucha ayuda. Finalmente, descubrí que usar el atributo de familia combinado con el atributo de cara funcionaba:

UIFontDescriptor* desc = [UIFontDescriptor fontDescriptorWithFontAttributes: @{ UIFontDescriptorFamilyAttribute: @"Helvetica Neue", UIFontDescriptorFaceAttribute: @"Light" } ];


De la documentación:

Font Traits Dictionary Keys

Las siguientes constantes se pueden usar como claves para recuperar información sobre un descriptor de fuente de su diccionario de rasgos.

NSString *const UIFontSymbolicTrait; NSString *const UIFontWeightTrait; NSString *const UIFontWidthTrait; NSString *const UIFontSlantTrait;

Esto me parece que estas teclas están diseñadas solo para obtener información de un descriptor de fuente, no para configurarla . Por ejemplo, podrías hacer algo como esto:

UIFont *font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; NSDictionary *traits = [font.fontDescriptor objectForKey:UIFontDescriptorTraitsAttribute]; CGFloat weight = [traits[UIFontWeightTrait] floatValue];

Lo que te mostraría que la fuente que recibiste es un poco más pesada que el peso normal. Esto no parece tan útil como poder pedir un peso más ligero de una fuente sin tener que dar un nombre exacto, pero parece ser el uso previsto.