web-dev-qa-db-fra.com

Ajuster l'espacement des lettres dans iOS 7

Dans iOS 7, lorsque vous revenez en arrière en utilisant le nouveau geste de balayage depuis le bord de l'écran, le titre du bouton Retour ("Artistes") passe du rose (dans l'exemple ci-dessous) et du poids normal de la police au noir et ayant un poids de police gras.

enter image description here

Il me semble que l'animation utilise deux labels différents pour obtenir cet effet; l'un s'estompe tandis que l'autre disparaît. Cependant, Apple a en quelque sorte ajusté la police de sorte que l'étiquette régulière superpose parfaitement celle en gras, créant ainsi l'illusion d'une seule étiquette morphing entre deux poids différents et les couleurs.

Ont-ils simplement ajusté l'espacement des lettres sur la police régulière pour qu'elle corresponde à celle en gras? Dans ce cas, comment cela serait-il possible dans iOS 7? Est-ce que Text Kit a des fonctionnalités impressionnantes pour le faire ou comment dois-je m'y prendre?

35
wstr

Vous pouvez ajuster l'espacement des lettres comme ceci, en utilisant NSAttributedString.

Dans l'objectif-C:

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

self.label.attributedText = attributedString;

Dans Swift:

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

label.attributedText = attributedString

Plus d'informations sur le crénage sont disponibles dans Concepts typographiques du Guide de programmation de texte .

Je ne pense pas qu'il existe une fonctionnalité TextKit qui correspondra automatiquement à l'espacement des polices entre le texte en gras et le texte normal.

88
Aaron Brager

Pour Swift 4+ la syntaxe est aussi simple que:

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

Avec Swift 4 et iOS 11, NSAttributedStringKey a une propriété statique appelée kern. kern a ce qui suit declaration =:

static let kern: NSAttributedStringKey

La valeur de cet attribut est un objet NSNumber contenant une valeur à virgule flottante. Cette valeur spécifie le nombre de points permettant d'ajuster les caractères de paire de crénage. Le crénage empêche la présence d'espace indésirable entre des caractères spécifiques et dépend de la police. La valeur 0 signifie que le crénage est désactivé. La valeur par défaut de cet attribut est 0.

Le code Playground suivant montre une implémentation possible de kern afin d'avoir un certain espacement des lettres dans votre 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()
1
Imanou Petit