How to set kerning in iPhone UILabel
Old question, but you can do it now (easily).
NSMutableAttributedString *attributedString;attributedString = [[NSMutableAttributedString alloc] initWithString:@"Please get wider"];[attributedString addAttribute:NSKernAttributeName value:@5 range:NSMakeRange(10, 5)];[self.label setAttributedText:attributedString];
For Nov 2013, Just to expand on this great answer, here's some totally typical code. Usually you'd set the font as well. Note in the comments the old-fashioned way using ordinary old .text. Hope it helps someone
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];
Before:
After:
Here's a Swift 3 extension that let's you set a UILabel's kerning via code or storyboard:
extension UILabel { @IBInspectable var kerning: Float { get { var range = NSMakeRange(0, (text ?? "").count) guard let kern = attributedText?.attribute(NSAttributedStringKey.kern, 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(NSAttributedStringKey.kern, value: NSNumber(value: newValue), range: range) self.attributedText = attText } }}
Demo usage:
myLabel.kerning = 3.0
or
The demo uses 3.0 kerning for drama, but I've found 0.1 - 0.8 tends to work well in practice.
Taking DBD's answer, I made a category on UILabel which allows setting the kerning if running on iOS6+ with graceful fall back to just setting text on previous iOS versions. Might be of help to others...
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];}