ios - custom - uiappfonts
Espacio entre letras en iOS (3)
Tengo el siguiente código:
[[cancelButton titleLabel] setFont:[UIFont fontWithName:@"ProximaNova-Regular" size:15]];
¿Cómo puedo configurar el espaciado de letras también?
Uno de los atributos de Core Text admitidos es kCTKernAttributeName, que a partir de iOS 6 es más fácil de aprovechar a través de la adición NSKernAttributeName de UIKit. Puede utilizar el kerning para ajustar el espaciado horizontal de los glifos.
El kerning es el ajuste del espacio entre dos letras únicas. El kerning varía entre los diferentes pares de caracteres. Por ejemplo, una combinación como ''AVA'' tendría un kerning diferente entre los caracteres que algo como ''VVV''
Al usar NSKernAttributeName, en realidad está anulando ese ajuste de espacio personalizado que está integrado en el archivo de fuente, configurando todos los valores de kern del par de caracteres en el mismo número, rompiendo así el kerning óptimo. Cuando se aplica a una cadena de texto completa, se notan pequeñas cantidades de kerning en el espacio roto. Sin embargo, los valores altos de kerning podrían hacer que la letra se separe lo suficiente hasta el punto de que el espaciado pobre no será tan notable.
Lo que estás buscando es Rastreo (también conocido como espacio entre letras), que es el espacio entre todas las letras en un bloque de texto dado. Desafortunadamente, iOS no parece permitirte controlar ese atributo.
No puede cambiar el espacio entre letras en el resumen, lo que significa que no puede cambiarlo en absoluto en iOS 5 y más abajo.
A partir de iOS 6, puede enviar una cadena atribuida en lugar de una de vainilla a una UILabel
. El proceso para empujar una cadena atribuida funciona de manera ligeramente diferente al proceso para empujar una normal: la fuente, el color del texto y un conjunto de otras propiedades están todos establecidos en la cadena en lugar de en la etiqueta. La razón es que las cadenas atribuidas permiten establecer diferentes atributos para diferentes regiones de la cadena. Por lo tanto, puede establecer una cadena que combine varias fuentes, colores de texto, etc.
Uno de los atributos de Core Text kCTKernAttributeName
es kCTKernAttributeName
, que a partir de iOS 6 es más fácil de aprovechar a través de la adición NSKernAttributeName
. Puede utilizar el kerning para ajustar el espaciado horizontal de los glifos.
Bajo iOS 5 y versiones anteriores, solía hacer muchos saltos mentales entre los objetos de estilo C de Core Foundation y los objetos UIKit de Objective-C. A partir del 6 eso ya no es necesario. Pero tenga cuidado si busca en la red que las cosas se han __bridge
mucho menos que en 6: si ve un montón de __bridge
de __bridge
y CFRelease
manual, entonces probablemente esté viendo un código más antiguo.
De todos modos, suponiendo que actualmente tienes algo como:
UILabel *label = [cancelButton titleLabel];
UIFont *font = <whatever>;
UIColor *textColour = <whatever>;
NSString *string = <whatever>;
label.text = string;
label.font = font;
label.textColor = textColour;
En su lugar, harías algo más como:
NSAttributedString *attributedString =
[[NSAttributedString alloc]
initWithString:string
attributes:
@{
NSFontAttributeName : font,
NSForegroundColorAttributeName : textColour
}];
label.attributedText = attributedString;
En su caso, también para ajustar el kerning general que agregaría:
NSAttributedString *attributedString =
[[NSAttributedString alloc]
initWithString:string
attributes:
@{
NSFontAttributeName : font,
NSForegroundColorAttributeName : textColour,
NSKernAttributeName : @(-1.3f)
}];
label.attributedText = attributedString;
O cualquier valor de kerning que quieras aplicar. Vea las distintas constantes en la parte inferior de la Referencia de adiciones de UIKit de NSAttributedString para conocer los otros atributos que puede aplicar y en qué versión de iOS estuvieron disponibles por primera vez.
Adenda mucho más tarde: aunque sigue siendo una de las personas con menos Swifty que conocerás, creo que este es el equivalente en Swift:
button.titleLabel?.attributedText =
NSAttributedString(
string: string,
attributes:
[
NSFontAttributeName: font,
NSForegroundColorAttributeName: textColour,
NSKernAttributeName: -1.3
])
NSAttributedString *cancelButtonAttributedString =[[NSAttributedString alloc]
initWithString:@"Hello"
attributes:
@{
NSKernAttributeName : @(1.5)
}];
[cancelButton setAttributedTitle:bittonAttributedString forState:UIControlStateNormal];
Esta es solo una respuesta simple para la pregunta anterior.