在iOS 7中调整字母间距

39
在iOS 7中,使用新的从屏幕边缘滑动手势导航回退时,后退按钮的标题(“艺术家”)从粉色(如下图所示)和常规字体重量逐渐变为黑色和粗体字重量。 enter image description here 在我的看来,该动画使用两个不同的标签来实现这个效果;一个淡出时,另一个淡入。然而,苹果公司已经通过某种方式调整了字体,使得常规标签完美地覆盖了粗体标签,从而创造出单个标签在两种不同的字重和颜色之间变形的假象。
他们是否只是调整了常规字体的字距,以便其与粗体字体匹配?在这种情况下,如何在iOS 7中实现呢?Text Kit有没有用于此的很棒的功能,或者我应该如何进行操作?
3个回答

95

您可以使用NSAttributedString这样调整字母间距。

在Objective-C中:

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;

在Swift 3中:

let attributedString = NSMutableAttributedString(string: "The Clash")
attributedString.addAttribute(NSKernAttributeName, value: CGFloat(1.4), range: NSRange(location: 0, length: 9))

label.attributedText = attributedString

在 Swift 4 及以后版本:

label.attributedText = NSAttributedString(string: "The Clash", attributes: [.kern: 1.4])

有关字距调整的更多信息,请参阅《文本编程指南中的排版概念》

我认为 TextKit 没有自动匹配粗体和普通文本之间字间距的功能。


1
有人了解字距和字间距之间的区别吗?据我所见,NSKernAttributeName涉及字间距但不涉及字距。 - Andrej
1
@Andrej 没有跟踪属性 - 请参见http://www.devsign.co/notes/tracking-and-character-spacing - Aaron Brager
在同一字符串中使用字距和字间距怎么样?例如,字距=10,字间距=默认值。? - ion
这个答案是正确的,但如果你想从Storyboard中实现它,请查看这个链接:https://dev59.com/K2s05IYBdhLWcg3wPPaB#35156265 - Arben Pnishi
对于后续版本,key 已重命名为 NSAttributedString.Key.kern - Jason Silver

5

对于 Swift 4+,语法非常简单:

let text = NSAttributedString(string: "text", attributes: [.kern: 1.4])

2

在Swift 5.3和iOS 14中,NSAttributedString.Key有一个名为kern的静态属性。 kern具有以下声明

static let kern: NSAttributedString.Key

该属性的值是一个包含浮点值的NSNumber对象。该值指定调整字距对字符的数量。字距调整可以防止特定字符之间出现不必要的空格,这取决于字体。值0表示禁用字距调整。此属性的默认值为0。
以下Playground代码展示了如何实现kern以在您的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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接