在iOS 7中调整字母间距

时间:2014-01-15 14:54:29

标签: ios7 uilabel textkit

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

enter image description here

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

他们是否只是调整了常规字体上的字母间距,使其与粗体字符匹配?在那种情况下,如何在iOS 7中实现? Text Kit是否有任何令人敬畏的功能,或者我应该怎么做呢?

3 个答案:

答案 0 :(得分:87)

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

在Objective-C中:

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

self.label.attributedText = attributedString;

在斯威夫特:

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

label.attributedText = attributedString

有关字距调整的更多信息,请参见Typographical Concepts from the Text Programming Guide

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

使用Swift 4和iOS 11,NSAttributedStringKey有一个名为kern的静态属性。 kern具有以下declaration

static let kern: NSAttributedStringKey
  

此属性的值是包含浮点值的NSNumber对象。此值指定调整kern-pair字符的点数。字距调整可防止特定字符之间出现不需要的空间,具体取决于字体。值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: [NSAttributedStringKey: Any] = [
            NSAttributedStringKey.kern: 2,
            NSAttributedStringKey.paragraphStyle: paragraph
        ]
        let attributedString = NSMutableAttributedString(string: string, attributes: attributes)

        let label = UILabel()
        label.attributedText = attributedString

        view.backgroundColor = .white
        view.addSubview(label)

        label.translatesAutoresizingMaskIntoConstraints = false
        label.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        label.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor).isActive = true
        label.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor).isActive = true
    }

}

PlaygroundPage.current.liveView = ViewController()