Adjust letter spacing in iOS 7
For Swift 4+ the syntax is as simple as:
let text = NSAttributedString(string: "text", attributes: [.kern: 1.4])
You can adjust letter spacing like this, using NSAttributedString
.
In Objective-C:
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:@"The Clash"];
[attributedString addAttribute:NSKernAttributeName
value:@(1.4)
range:NSMakeRange(0, 9)];
self.label.attributedText = attributedString;
In Swift 3:
let attributedString = NSMutableAttributedString(string: "The Clash")
attributedString.addAttribute(NSKernAttributeName, value: CGFloat(1.4), range: NSRange(location: 0, length: 9))
label.attributedText = attributedString
In Swift 4 and later:
label.attributedText = NSAttributedString(string: "The Clash", attributes: [.kern: 1.4])
More info on kerning is available in Typographical Concepts from the Text Programming Guide.
I don't think there's a TextKit feature that will automatically match font spacing between bold and regular text.
With Swift 5.3 and iOS 14, NSAttributedString.Key
has a static property called kern
. kern
has the following declaration:
static let kern: NSAttributedString.Key
The value of this attribute is an
NSNumber
object containing a floating-point value. This value specifies the number of points by which to adjust kern-pair characters. Kerning prevents unwanted space from occurring between specific characters and depends on the font. The value 0 means kerning is disabled. The default value for this attribute is 0.
The following Playground code shows a possible implementation of kern
in order to have some letter spacing in your NSAttributedString
:
import PlaygroundSupport
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let string = "Some text"
let paragraph = NSMutableParagraphStyle()
paragraph.alignment = .center
let attributes: [NSAttributedString.Key: Any] = [
NSAttributedString.Key.kern: 10,
NSAttributedString.Key.paragraphStyle: paragraph
]
let attributedString = NSMutableAttributedString(
string: string,
attributes: attributes
)
let label = UILabel()
label.attributedText = attributedString
view.backgroundColor = .white
view.addSubview(label)
label.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
label.centerYAnchor.constraint(equalTo: view.centerYAnchor),
])
}
}
PlaygroundPage.current.liveView = ViewController()