web-dev-qa-db-fra.com

Comment changer l'espacement des lettres dans UILabel?

Je souhaite modifier l'espacement entre les chiffres dans une variable UIKitUILabel afin qu'elle soit égale.

Avec un espacement standard, l'étiquette ressemble à ceci: 

 label with uneven character spacing

J'aimerais que cela ressemble à ceci:

 label with even character spacing

Comment cela peut il etre accompli?

12
Ben Thomas

Vous pouvez utiliser l'attribut NSKernAttributeName sur une chaîne attribuée:

UILabel *label = [UILabel new];

NSMutableAttributedString *text = [[NSMutableAttributedString alloc] 
                                   initWithString:@"127"];

// The value paramenter defines your spacing amount, and range is 
// the range of characters in your string the spacing will apply to. 
// Here we want it to apply to the whole string so we take it from 0 to text.length.
[text addAttribute:NSKernAttributeName 
             value:@-0.5 
             range:NSMakeRange(0, text.length)];

[label setAttributedText:text];
18
J2K

Le moyen le plus simple consiste à créer une classe UILabel personnalisée et à définir l'espacement des lettres à partir de Storyboard.

open class CustomLabel : UILabel {
    @IBInspectable open var characterSpacing:CGFloat = 1 {
        didSet {
            let attributedString = NSMutableAttributedString(string: self.text!)
            attributedString.addAttribute(NSKernAttributeName, value: self.characterSpacing, range: NSRange(location: 0, length: attributedString.length))
            self.attributedText = attributedString
        }

    }
}

 enter image description here

16
miOS

Vous pouvez utiliser NSAttributedString et jouer avec l'attribut NSKernAttributeName. La valeur par défaut pour cela est 0, vous voudrez donc lui attribuer un nombre négatif.

https://developer.Apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSAttributedString_Class/#//Apple_ref/doc/constant_group/Character_Attributes

dans Obj-C, vous pouvez faire quelque chose comme ceci:

NSMutableAttributedString* attrStr = [[NSMutableAttributedString alloc]initWithString: @"Test test test test "];
[attrStr addAttribute:NSKernAttributeName value:@(4.0) range:NSMakeRange(0, attrStr.length)];

label.attributedText = attrStr;

dans Swift, vous pourriez faire quelque chose comme ça:

let myTitle = "my title"
let titleLabel = UILabel()
let attributes: NSDictionary = [
    NSFontAttributeName:UIFont(name: "FONT_NAME", size: TEXT_SIZE),
    NSKernAttributeName:CGFloat(2.0)
]

let attributedTitle = NSAttributedString(string: myTitle, attributes:attributes as? [String : AnyObject])

titleLabel.attributedText = attributedTitle
6
Joel Nieman

Le NSKernAttributeName peut être utilisé.

Mais pour corriger les autres réponses: Ne vous appliquez pas à la longueur du texte complet, mais à (text.length - 1).

L'espacement négatif ou positif est ajouté à la lettre et n'est pas requis pour la dernière. Supposons que vous ajoutiez un espacement positif qui finirait par un espacement après la dernière lettre. Une chaîne centrée ne semble plus être centrée. La même chose s'applique pour l'espacement négatif.

NSString *text = @"Sample Text";    
UILabel *label = [UILabel new]

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString: text];
[attributedString addAttribute:NSKernAttributeName value:[NSNumber numberWithDouble:-1.0] range:NSMakeRange(0, text.length-1)];

[label setAttributedTitle:attributedString forState:UIControlStateNormal];

Appliqué à la longueur du texte complet.

 Applied to full text length.

Appliqué à (longueur du texte - 1). Applied to (text length - 1).

3
jn-se

Si vous souhaitez appliquer l'attribut d'espacement des lettres à tous les UILabels dans Interface Builder sans rien modifier (pour une police particulière):

Swift 4:

/**
 * Applies letter spacing to selected fonts in UILabels from IB.
 *
 * - author Alexander Volkov
 * - version 1.0
 */
extension UILabel {

    /// Applies letter spacing
    open override func awakeFromNib() {
        super.awakeFromNib()
        applyLetterSpacing()
    }

    /// Applies letter spacing
    ///
    /// - Parameter aDecoder: the decoder
    /// - Returns: UILabel instance
    open override func awakeAfter(using aDecoder: NSCoder) -> Any? {
        let label = super.awakeAfter(using: aDecoder)
        self.applyLetterSpacing()
        return label
    }


    /// Applies letter spacing
    func applyLetterSpacing() {
        if font.fontName.contains("Oswald", caseSensitive: false) {
            let characterSpacing: CGFloat = 1
            let string = NSMutableAttributedString(string: self.text!)
            string.addAttribute(.kern, value: characterSpacing, range: NSRange(location: 0, length: string.length - 1))
            self.attributedText = string
        }
    }
}
2
Alexander Volkov
NSString *myString = @"127";
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:myString];

float letterSpacing = -1.50f; // change spacing here
[attributedString addAttribute:NSKernAttributeName value:@(letterSpacing) range:NSMakeRange(0, [myString length])];
[myLabel setAttributedText:attributedString];

Voir aussi ceci pour plus d'informations et les résultats: http://www.devsign.co/notes/tracking-and-character-spacing

1
emotality

Essaye ça. Il ajoutera l'espacement des caractères que vous affectez, que vous définissiez un texte simple ou un texte attribué. https://stackoverflow.com/a/49929848/4559803

0
Umair

cliquez sur l'étiquette et allez dans votre inspecteur d'attributs. Changer le texte de plaine à attribuer. Vous vous aurez plusieurs options pour l'espacement. J'espère que cela t'aides.

0
Kayamba Mukanzu

J'ai pris la réponse de @ J2K et l'ai traduite en Swift 4.2 extension.

/// Set the text of the label but altering the kerning so that you can control the space between each characters.
///
/// - Parameters:
///   - text: New content of the label
///   - kerning: Set a value between 0 and 1 to lower the space between characters. Above 0, spacing will be increased. 0 disables kerning.
extension UILabel {

    func set(text: String, withKerning kerning: CGFloat) {
        let attributedString = NSMutableAttributedString(string: text)

        // The value parameter defines your spacing amount, and range is
        // the range of characters in your string the spacing will apply to.
        // Here we want it to apply to the whole string so we take it from 0 to text.count.
        attributedString.addAttribute(NSAttributedString.Key.kern, value: kerning, range: NSMakeRange(0, text.count))

        attributedText = attributedString
    }

}
0
Pomme2Poule