¿Cómo hacer que un UIF no sea negrita o cursiva?

Tener un UILabel con cualquier fuente, ¿cómo puedo saber si ya está en negrita? ¿O cómo puedo hacerlo en negrita? En CSS, tengo un atributo de font-weight . Me gustaría tener algo similar.

Todo lo que descubrí hasta ahora es que tienes que establecer el nombre de fuente adecuado. Sin embargo, esto no es confiable. La versión audaz de Cochin es Cochin-Bold , pero la versión en negrita de ArialMT no es ArialMT-Bold sino Arial-BoldMT , por lo que obviamente no es suficiente para anexar -Bold . (La versión en negrita de una fuente personalizada también podría tener un nombre totalmente diferente).

Lo que puedo hacer es encontrar todas las fonts para la familia de mi fuente dada.

 __block UIFont *font = myLabel.font; [[UIFont fontNamesForFamilyName:font.familyName] enumerateObjectsUsingBlock:^(NSString *fontName, NSUInteger idx, BOOL *stop) { if ([fontName rangeOfString:@"bold" options:NSCaseInsensitiveSearch].location != NSNotFound) { font = [UIFont fontWithName:fontName size:font.pointSize]; *stop = YES; } }]; myLabel.font = font; 

Pero esto no funciona de manera confiable. Puedo get fácilmente una versión BoldItalic . Podría mejorar mi cheque para evitar esto, pero no es realmente una buena solución.

Tal vez CoreText puede ayudar aquí?

Tal vez CoreText puede ayudar aquí?

CoreText usa su propio sistema de fonts, CTFont. Si estás usando eso, puedes hacer lo que quieras:

 CTFontRef font = CTFontCreateWithName((__bridge CFStringRef)name, size, NULL); CTFontRef boldFont = CTFontCreateCopyWithSymbolicTraits(font, 0.0, NULL, kCTFontBoldTrait, kCTFontBoldTrait); 

Supongo que podría get el nombre de la fuente en negrita derivada:

 CFStringRef boldName = CTFontCopyPostScriptName(boldFont); 

… y usarlo para crear un nuevo UIFont:

 UIFont *ret = [UIFont fontWithName:(NSString *)boldName size:size]; 

No sé qué tan rápido sería esto, pero podría hacerlo al iniciar la aplicación y luego save los nombres en caching.

UIFontDescriptorSymbolicTraits describe simbólicamente los aspectos estilísticos de una fuente. Los 16 bits superiores se utilizan para describir la apariencia de la fuente, mientras que los 16 bits más bajos para la tipografía. La información de aspecto de fuente representada por los 16 bits superiores se puede usar para la coincidencia de fuente estilística.

Swift 3

 extension UIFont { convenience init?(name: String, size: CGFloat, symbolicTraits: UIFontDescriptorSymbolicTraits) { guard let descriptor = UIFontDescriptor(name: name, size: size).withSymbolicTraits(symbolicTraits) else { return nil } self.init(descriptor: descriptor, size: size) } } 

Introducido con iOS 7, UIFontDescriptor es la herramienta para hacerlo.

Para averiguar si la fuente ya está en negrita, obtenga el UIFontDescriptor de su fuente (a través de la propiedad fontDescriptor de fontDescriptor ), luego llame a UIFontDescriptorTraitBold e inspeccione la máscara de bits resultante para UIFontDescriptorTraitBold .

Del mismo modo, para encontrar una versión en negrita, tome el descriptor de fuente para la fuente original y llame a - fontDescriptorWithSymbolicTraits: A continuación, puede volver a convertirlo en UIFont llamando a + [UIFont fontWithDescriptor:size:] .