web-dev-qa-db-fra.com

Espacement des lettres sous iOS

J'ai le code suivant:

[[cancelButton titleLabel] setFont:[UIFont fontWithName:@"ProximaNova-Regular" size:15]];

Comment définirais-je l'espacement des lettres?

16
David542

Vous ne pouvez pas modifier l'espacement des lettres dans l'abrégé, ce qui signifie que vous ne pouvez pas le changer du tout sous iOS 5 et inférieur.

Depuis iOS 6, vous pouvez pousser une chaîne attribuée plutôt qu'une chaîne Vanilla vers un UILabel. Le processus permettant de pousser une chaîne attribuée fonctionne légèrement différemment du processus consistant à appliquer une chaîne ordinaire: la police, la couleur du texte et de nombreuses autres propriétés sont tous définis sur la chaîne plutôt que sur l'étiquette. La raison en est que les chaînes attribuées permettent de définir différents attributs pour différentes régions de la chaîne. Vous pouvez ainsi définir une chaîne combinant plusieurs polices, couleurs de texte, etc.

Un des attributs de texte principal pris en charge est kCTKernAttributeName, qui depuis iOS 6 est plus facile à exploiter grâce à l’ajout de UIKit NSKernAttributeName. Vous pouvez utiliser le crénage pour ajuster l'espacement horizontal des glyphes.

Sous iOS 5 et les versions antérieures, vous deviez faire beaucoup de va-et-vient entre les objets de style C de Core Foundation et les objets UIKit d'Objective-C. À partir de 6, ce n'est plus nécessaire. Mais méfiez-vous si vous recherchez sur le net que les choses ont beaucoup moins de mal en moins de 6 ans - si vous voyez beaucoup de jets __bridge et de CFReleases à la main, vous avez probablement un code plus ancien.

Quoi qu'il en soit, supposons que vous ayez actuellement quelque chose comme:

UILabel *label = [cancelButton titleLabel];

UIFont *font = <whatever>;
UIColor *textColour = <whatever>;
NSString *string = <whatever>;

label.text = string;
label.font = font;
label.textColor = textColour;

Vous feriez plutôt quelque chose de plus semblable à:

NSAttributedString *attributedString = 
    [[NSAttributedString alloc]
          initWithString:string
          attributes:
              @{
                    NSFontAttributeName : font,
                    NSForegroundColorAttributeName : textColour
              }];

label.attributedText = attributedString;

Dans votre cas, également pour ajuster le crénage global, ajoutez:

NSAttributedString *attributedString = 
    [[NSAttributedString alloc]
          initWithString:string
          attributes:
              @{
                    NSFontAttributeName : font,
                    NSForegroundColorAttributeName : textColour,
                    NSKernAttributeName : @(-1.3f)
              }];

label.attributedText = attributedString;

Ou quelle que soit la valeur de crénage que vous souhaitez appliquer. Voir les différentes constantes au bas de NSAttributedString UIKit Additions Reference pour connaître les autres attributs que vous pouvez appliquer et la version d'iOS sur laquelle ils sont devenus disponibles.

Bien plus tard, addendum: je pense que c'est l'équivalent de Swift:

button.titleLabel?.attributedText =
    NSAttributedString(
        string: string,
        attributes:
        [
            NSFontAttributeName: font,
            NSForegroundColorAttributeName: textColour,
            NSKernAttributeName: -1.3
        ])
53
Tommy
    NSAttributedString *cancelButtonAttributedString =[[NSAttributedString alloc]
                                           initWithString:@"Hello"
                                           attributes:
                                           @{
                                             NSKernAttributeName : @(1.5)
                                             }];
    [cancelButton setAttributedTitle:bittonAttributedString forState:UIControlStateNormal];

Ceci est seulement une réponse simple à la question ci-dessus

1
Jagveer Singh

Un des attributs Core Text pris en charge est kCTKernAttributeName, qui depuis iOS 6 est plus facile à exploiter via l’addition UIKit NSKernAttributeName. Vous pouvez utiliser le crénage pour ajuster l'espacement horizontal des glyphes.

Le crénage est l'ajustement de l'espace entre deux lettres uniques. Le crénage varie entre différentes paires de caractères. Par exemple, une combinaison comme "AVA" aurait un crénage différent entre les caractères et quelque chose comme "VVV"

En utilisant NSKernAttributeName, vous redéfinissez en réalité l'ajustement d'espace personnalisé intégré dans le fichier de polices. Vous définissez toutes les valeurs de kern des paires de caractères sur le même nombre, rompant ainsi le crénage optimal. Lorsqu'elle est appliquée à une chaîne de texte entière, le crénelage de petites distances est plus perceptible. Cependant, des valeurs de crénage élevées pourraient éloigner suffisamment la lettre de sorte que le faible espacement ne soit plus aussi perceptible.

Ce que vous recherchez, c’est le suivi (ou espacement des lettres), qui correspond à l’espacement entre toutes les lettres d’un bloc de texte donné. Malheureusement, iOS ne semble pas vous permettre de contrôler cet attribut.

0
Payam Rajabi