ios cocoa-touch uilabel kerning

ios - Cómo configurar kerning en iPhone UILabel



cocoa-touch (8)

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


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 <UIKit/UIKit.h> 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


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.



Tomando la respuesta de DBD, hice una categoría en UILabel que permite configurar 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 <UIKit/UIKit.h> @interface UILabel (TextKerning) /** * Set the label''s text to the given string, using the given kerning value if able. * (i.e., 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]; }


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

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


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


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


Antes de:

Después:

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

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