50

I am creating an app in >=iOS6. And I want to change the character spacing in UILabel. I have added the custom font "FUTURABT HEAVY" in my app but the Character are too close to eachother.

I have find the good code here to increase the character spacing. But if i tried to change it than my text became left- align in stead of center.

Please help me with this situation.

Krunal
  • 77,632
  • 48
  • 245
  • 261
Dilip Manek
  • 9,095
  • 5
  • 44
  • 56

6 Answers6

84

You should probably use NSAttributedString with NSKernAttributeName attribute

Here is a small example:

UILabel *label = [[UILabel alloc] initWithFrame:self.view.bounds];

NSString *string = @"Some important text";
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:string];

float spacing = 5.0f;
[attributedString addAttribute:NSKernAttributeName
            value:@(spacing)
            range:NSMakeRange(0, [string length])];

label.attributedText = attributedString;
[self.view addSubview:label];
B.S.
  • 21,660
  • 14
  • 87
  • 109
  • If you want to set it from Interface Builder, add a UILabel subclass, override setText: method and then set MyLabel as the name of the class for your labels in Interface Builder. It works! :) – codeburn Aug 12 '15 at 11:55
  • tried it, solution works, however in my case I need to center the label and auto layout works incorrectly – Nik Yekimov Sep 10 '15 at 15:11
  • If anyone needs a solution, check it here: http://stackoverflow.com/a/35156265/4173671 – Arben Pnishi Feb 03 '16 at 14:20
  • But I check It still not effect on Title of navigation bar, why? – Linh Nguyen Nov 21 '16 at 05:01
65

Swift extension for this

extension UILabel {
    func addCharactersSpacing(spacing:CGFloat, text:String) {
        let attributedString = NSMutableAttributedString(string: text)
        attributedString.addAttribute(NSAttributedString.Key.kern, value: spacing, range: NSMakeRange(0, text.count-1))
        self.attributedText = attributedString
    }
}

So you can use it

MyLabel.addCharactersSpacing(5, text: "Some Text")
Divine
  • 118
  • 1
  • 9
Steve
  • 959
  • 1
  • 11
  • 23
  • Thanx for adding swift code, it will definitely help some one. upvote for you. – Dilip Manek Dec 22 '15 at 04:54
  • 1
    Thanks for your help! There was extra space on the end of the string (which in my case was causing a horizontal centering issue), but I fixed it by changing the range to NSMakeRange(0, text.characters.count - 1) – tdon Jan 11 '17 at 03:27
13

Swift 4

extension UILabel {

   func setCharacterSpacing(characterSpacing: CGFloat = 0.0) {

        guard let labelText = text else { return }

        let attributedString: NSMutableAttributedString
        if let labelAttributedText = attributedText {
            attributedString = NSMutableAttributedString(attributedString: labelAttributedText)
        } else {
            attributedString = NSMutableAttributedString(string: labelText)
        }

        // Character spacing attribute
        attributedString.addAttribute(NSAttributedStringKey.kern, value: characterSpacing, range: NSMakeRange(0, attributedString.length))

        attributedText = attributedString
    }        

}

Swift 3

let label = UILabel()
let stringValue = "Sample text"
let attrString = NSMutableAttributedString(string: stringValue)
attrString.addAttribute(NSKernAttributeName, 2: style, range: NSRange(location: 0, length: stringValue.characters.count))
label.attributedText = attrString
Kqtr
  • 5,824
  • 3
  • 25
  • 32
Krunal
  • 77,632
  • 48
  • 245
  • 261
2

Here the code for Swift 5 with a handy extension :

extension UILabel {
    func addCharactersSpacing(spacing: CGFloat, txt: String) {
        let attributedString = NSMutableAttributedString(string: txt)
        attributedString.addAttribute(NSAttributedString.Key.kern, value: spacing, range: NSRange(location: 0, length: txt.count))
        self.attributedText = attributedString
    }
}
Medhi
  • 2,656
  • 23
  • 16
1

Swift 4.2 with UILabel extension and @IBInspectable

extension UILabel {
@IBInspectable var letterSpacing: CGFloat {
    get {
        var range:NSRange = NSMakeRange(0, self.text?.count ?? 0)
        let nr = self.attributedText?.attribute(NSAttributedString.Key.kern, at: 0, effectiveRange: &range) as! NSNumber
        return CGFloat(truncating: nr)
    }

    set {
        let range:NSRange = NSMakeRange(0, self.text?.count ?? 0)

        let attributedString = NSMutableAttributedString(string: self.text ?? "")
        attributedString.addAttribute(NSAttributedString.Key.kern, value: newValue, range: range)
        self.attributedText = attributedString
    }
}

}

Randy
  • 11
  • 2
0
   NSString *strDigit= @"001";
   NSString *strCrushImpact =[NSStringstringWithFormat:@"%d",[strDigit intValue]];

       // Set space in between character
   float spacing = 3.0f;

   NSMutableAttributedString *attributedStrDigit = [[NSMutableAttributedString alloc] initWithString:strWin];
   [strCrushImpact addAttribute:NSKernAttributeName value:@(spacing)
             range:NSMakeRange(0, [strDigit length])];
 label.attributedText = attributedStrDigit;