39

在 iOS 7 中,当使用新的从屏幕边缘滑动手势导航返回时,返回按钮的标题(“艺术家”)从粉红色(在下面的示例中)淡化,并且具有常规字体粗细到黑色并具有粗体字重。

在此处输入图像描述

在我看来,动画使用了两个不同的标签来达到这个效果;一个随着另一个淡入而淡出。然而,Apple 以某种方式调整了字体,使常规标签完美地覆盖了粗体标签,从而产生了单个标签在两种不同重量和颜色之间变形的错觉。

他们是否只是简单地调整了常规字体上的字母间距,使其与粗体匹配?在那种情况下,如何在 iOS 7 中实现呢?Text Kit 是否有任何很棒的功能可以做到这一点,或者我应该如何去做?

4

3 回答 3

95

您可以像这样调整字母间距,使用NSAttributedString.

在 Objective-C 中:

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:@"The Clash"];
[attributedString addAttribute:NSKernAttributeName
                         value:@(1.4)
                         range:NSMakeRange(0, 9)];
    
self.label.attributedText = attributedString;

在斯威夫特 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])

有关字距调整的更多信息,请参阅 Text Programming Guide 中的 Typographical Concepts

我不认为有一个 TextKit 功能可以自动匹配粗体和常规文本之间的字体间距。

于 2014-01-15T15:15:17.537 回答
5

对于Swift 4+,语法很简单:

let text = NSAttributedString(string: "text", attributes: [.kern: 1.4])
于 2018-03-13T09:01:56.860 回答
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()
于 2018-01-27T00:34:38.010 回答