How to set kerning in iPhone UILabel How to set kerning in iPhone UILabel ios ios

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

enter image description here

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:

before

After:

cafter

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

enter image description here

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