Cómo configurar kerning en iPhone UILabel

Estoy desarrollando una aplicación para iPhone, y quiero establecer el kerning en UILabel. El código que he escrito (posiblemente alrededor de kCTKernAttributeName ) parece estar en error. ¿Cómo podría abordar la solución de esto?

 NSMutableAttributedString *attStr; NSString *str = @"aaaaaaa"; CFStringRef kern = kCTKernAttributeName; NSNumber *num = [NSNumber numberWithFloat: 2.0f]; NSDictionary *attributesDict = [NSDictionary dictionaryWithObject:num forKey:(NSString*)kern]; [attStr initWithString:str attributes:attributesDict]; CGRect frame1 = CGRectMake(0, 0, 100, 40); UILabel *label1 = [[UILabel alloc] initWithFrame:frame1]; label1.text = attStr [self.view addSubview:label1]; 

Pregunta anterior, pero puede hacerlo ahora (fácilmente).

 NSMutableAttributedString *attributedString; attributedString = [[NSMutableAttributedString alloc] initWithString:@"Please get wider"]; [attributedString addAttribute:NSKernAttributeName value:@5 range:NSMakeRange(10, 5)]; [self.label setAttributedText:attributedString]; 

enter image description here

Para noviembre de 2013, solo para ampliar esta gran respuesta, aquí hay un código totalmente típico. Por lo general, también debe establecer la fuente. Nota en los comentarios a la antigua usanza de .text ordinario. Espero que ayude a alguien

 NSString *yourText = @"whatever"; UILabel* label = [[UILabel alloc] initWithFrame:CGRectMake(0,0,0,0)]; // simple approach with no tracking... // label.text = yourText; // [label setFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:24]]; NSMutableAttributedString *attributedString; attributedString = [[NSMutableAttributedString alloc] initWithString:yourText]; [attributedString addAttribute:NSKernAttributeName value:[NSNumber numberWithFloat:2.0] range:NSMakeRange(0, [yourText length])]; [attributedString addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"HelveticaNeue-Light" size:24] range:NSMakeRange(0, [yourText length])]; label.attributedText = attributedString; label.textColor = [UIColor blackColor]; label.backgroundColor = [UIColor clearColor]; label.textAlignment = NSTextAlignmentCenter; [label sizeToFit]; 

Antes de:

antes de

Después:

cafter

Aquí hay una extensión de Swift 2 que le permite configurar el interletraje de UILabel mediante código o guión gráfico :

 extension UILabel { @IBInspectable var kerning: Float { get { var range = NSMakeRange(0, (text ?? "").characters.count) guard let kern = attributedText?.attribute(NSKernAttributeName, at: 0, effectiveRange: &range), let value = kern as? NSNumber else { return 0 } return value.floatValue } set { var attText:NSMutableAttributedString if let attributedText = attributedText { attText = NSMutableAttributedString(attributedString: attributedText) } else if let text = text { attText = NSMutableAttributedString(string: text) } else { attText = NSMutableAttributedString(string: "") } let range = NSMakeRange(0, attText.length) attText.addAttribute(NSKernAttributeName, value: NSNumber(value: newValue), range: range) self.attributedText = attText } } } 

Uso de demostración:

 myLabel.kerning = 3.0 

o

enter image description here

La demostración usa kerning 3.0 para dtwig, pero he encontrado 0.1 – 0.8 tiende a funcionar bien en la práctica.

Tomando la respuesta de DBD, hice una categoría en UILabel que permite establecer el interletraje si se ejecuta en iOS6 + con elegancia, volver a configurar el texto en versiones anteriores de iOS. Podría ser de ayuda para otros …

UILabel + TextKerning.h

 #import  @interface UILabel (TextKerning) /** * Set the label's text to the given string, using the given kerning value if able. * (ie, if running on iOS 6.0+). The kerning value specifies the number of points * by which to adjust spacing between characters (positive values increase spacing, * negative values decrease spacing, a value of 0 is default) **/ - (void) setText:(NSString *)text withKerning:(CGFloat)kerning; /** * Set the kerning value of the currently-set text. The kerning value specifies the number of points * by which to adjust spacing between characters (positive values increase spacing, * negative values decrease spacing, a value of 0 is default) **/ - (void) setKerning:(CGFloat)kerning; @end 

UILabel + TextKerning.m

 #import "UILabel+TextKerning.h" @implementation UILabel (TextKerning) -(void) setText:(NSString *)text withKerning:(CGFloat)kerning { if ([self respondsToSelector:@selector(setAttributedText:)]) { NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:text]; [attributedString addAttribute:NSKernAttributeName value:[NSNumber numberWithFloat:kerning] range:NSMakeRange(0, [text length])]; [self setAttributedText:attributedString]; } else [self setText:text]; } -(void) setKerning:(CGFloat)kerning { [self setText:self.text withKerning:kerning]; } 

Para estar actualizado aquí, iOS 6 introdujo UILabel para UILabel y UITextView .

Referencia UILabel:
http://developer.apple.com/library/ios/#documentation/uikit/reference/UILabel_Class/Reference/UILabel.html#//apple_ref/occ/instp/UILabel/attributedText

Solo haz esto en Swift:

  let myTitle = "my title" let titleLabel = UILabel() let attributes: NSDictionary = [ NSFontAttributeName:UIFont(name: "HelveticaNeue-Light", size: 20), NSForegroundColorAttributeName:UIColor.whiteColor(), NSKernAttributeName:CGFloat(2.0) ] let attributedTitle = NSAttributedString(string: myTitle, attributes: attributes as? [String : AnyObject]) titleLabel.attributedText = attributedTitle titleLabel.sizeToFit() 

Un ejemplo que usa IBDesignables e IBInspectables donde puede administrar establecer el valor de interletraje solo a través del guión gráfico. Lo encontré muy práctico y pensé compartirlo contigo.

UILabelKerning.h

 #import  IB_DESIGNABLE @interface UILabelKerning : UILabel @property (assign, nonatomic) IBInspectable int kerning; @end 

UILabelKerning.m

 #import "UILabelKerning.h" @implementation UILabelKerning -(void)awakeFromNib { [self setTheAttributes]; } - (id)initWithCoder:(NSCoder*)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { // Initialization code } return self; } -(void)setTheAttributes{ NSMutableAttributedString *attributedString =[[NSMutableAttributedString alloc] initWithAttributedString:self.attributedText]; [attributedString addAttribute:NSKernAttributeName value:[NSNumber numberWithFloat:self.kerning] range:NSMakeRange(0, [self.text length])]; [self setAttributedText:attributedString]; } @end 

enter image description here

enter image description here

enter image description here

Hasta donde yo sé, UILabel no mostrará las características de NSAttributedString . Hay un par de buenas soluciones de código abierto. Recientemente utilicé TTTAttributedLabel como un intercambio en reemplazo de UILabel que acepta NSAttributedString.

DTCoreText (antiguo NSAttributedString + HTML) también se está poniendo de moda últimamente.

En Swift 2.0 …

Agrega una extensión:

 extension UIView { func attributes(font: String, color: UIColor, fontSize: CGFloat, kern: Double) -> [String: NSObject] { let attribute = [ NSForegroundColorAttributeName: color, NSKernAttributeName: kern, NSFontAttributeName : UIFont(name: font, size: fontSize)! ] return attribute } } 

Ahora, simplemente configure su UILabel como texto atribuido:

 self.label.attributedText = NSMutableAttributedString(string: "SwiftExample", attributes: attributes("SourceSans-Regular", color: UIColor.whiteColor(), fontSize: 20, kern: 2.0)) 

Obviamente, agregué un montón de parámetros que puede que no necesites. Juega, siéntete libre de reescribir el método. Estaba buscando esto en un montón de respuestas diferentes, así que pensé en publicar toda la extensión en caso de que ayude a alguien por ahí … -rab