How to set kerning (spacing between characters) on UINavigationBar title - Swift or Objective-C

ios, kerning, objective-c, swift, user-interface

Solution

According to the documentation, the `titleTextAttributes` of `UINavigationBar` only lets you specify the font, text color, text shadow color, and text shadow offset.

If you want to use other attributes, you can create a `UILabel` with the `NSAttributedString` you want, and set it as the `titleView` for your controller's `navigationItem`

For example:

UILabel *titleLabel = [UILabel new];
NSDictionary *attributes = @{NSForegroundColorAttributeName: [UIColor whiteColor],
                             NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue-Light" size:20.0],
                             NSKernAttributeName: @2};
titleLabel.attributedText = [[NSAttributedString alloc] initWithString:self.navigationItem.title attributes:attributes];
[titleLabel sizeToFit];
self.navigationItem.titleView = titleLabel;

Problem

I've got my nav bar mostly customized to my liking, but I'm trying to increase the kerning using `NSKernAttributeName`. I'm using the appearance proxy to set the nav bar to white text and a custom font, but when I try to add kerning it doesn't take effect. ``` [[UINavigationBar appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: [UIColor whiteColor], NSForegroundColorAttributeName, [UIFont fontWithName:@"HelveticaNeue-Light" size:20.0], NSFontAttributeName, [NSNumber numberWithFloat:2.0], NSKernAttributeName, nil]]; ``` Do I need to do something else to add some of the less common attributes like kerning to the title label?

Original source