web-dev-qa-db-fra.com

Définir l'interligne UILabel

Comment puis-je modifier l'espace entre les lignes (interligne) dans une ligne multiple UILabel?

96
Matrix

Edit: Evidemment NSAttributedString le fera, sur iOS 6 et ultérieur. Au lieu d’utiliser une variable NSString pour définir le texte de l’étiquette, créez une NSAttributedString, définissez-y les attributs, puis définissez-la en tant que .attributedText sur l’étiquette. Le code que vous voulez ressemblera à ceci:

NSMutableAttributedString* attrString = [[NSMutableAttributedString  alloc] initWithString:@"Sample text"];
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
[style setLineSpacing:24];
[attrString addAttribute:NSParagraphStyleAttributeName
    value:style
    range:NSMakeRange(0, strLength)];
uiLabel.attributedText = attrString;

L'ancien attributStringWithString de NSAttributedString faisait la même chose, mais maintenant, that _ est obsolète.

Pour des raisons historiques, voici ma réponse initiale:

Réponse courte: tu ne peux pas. Pour changer l'espacement entre les lignes de texte, vous devrez sous-classe UILabel et créer votre propre drawTextInRect, créer plusieurs étiquettes ou utiliser une police différente (peut-être une police modifiée pour une hauteur de ligne spécifique, voir la réponse de Phillipe).

Réponse longue: Dans le monde imprimé et en ligne, l'espace entre les lignes de texte est appelé "lead" (rimes avec 'heading', et provient du plomb utilisé il y a plusieurs décennies). Leading est une propriété en lecture seule de UIFont, obsolète en 4.0 et remplacée par lineHeight. Autant que je sache, il n’ya aucun moyen de créer une police avec un ensemble spécifique de paramètres tels que lineHeight; vous obtenez les polices système et toute police personnalisée que vous ajoutez, mais vous ne pouvez pas les modifier une fois installées.

Il n'y a pas non plus de paramètre d'espacement dans UILabel.

Je ne suis pas particulièrement satisfait du comportement de UILabel en l'état. Je suggère donc d'écrire votre propre sous-classe ou d'utiliser une bibliothèque tierce. Cela rendra le comportement indépendant de votre choix de police et sera la solution la plus réutilisable.

Je souhaite qu'il y ait était plus de souplesse dans UILabel, et je serais heureux de pouvoir me tromper!

120
AndrewS

À partir de ios 6, vous pouvez définir une chaîne attribuée dans UILabel:

NSString *labelText = @"some text"; 
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:labelText];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setLineSpacing:40];
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [labelText length])];
cell.label.attributedText = attributedString ;
74
iosMentalist

Vous pouvez contrôler l’espacement des lignes dans le storyboard:

question en double

54
Mike S

Ma solution consistait à corriger le fichier de police lui-même et à fixer définitivement la hauteur de ligne . http://mbauman.net/geek/2009/03/15/minor-truetype-font-editing-on-a-mac/

J'ai dû modifier 'lineGap', 'ascender', 'descender' dans le bloc 'hhea' (comme dans l'exemple du blog).

15
Philippe

De Interface Builder:

enter image description here

Par programme:

Swift 4

Utiliser l'extension d'étiquette

extension UILabel {

    func setLineSpacing(lineSpacing: CGFloat = 0.0, lineHeightMultiple: CGFloat = 0.0) {

        guard let labelText = self.text else { return }

        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = lineSpacing
        paragraphStyle.lineHeightMultiple = lineHeightMultiple

        let attributedString:NSMutableAttributedString
        if let labelattributedText = self.attributedText {
            attributedString = NSMutableAttributedString(attributedString: labelattributedText)
        } else {
            attributedString = NSMutableAttributedString(string: labelText)
        }

        // Line spacing attribute
        attributedString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

        self.attributedText = attributedString
    }
}

Appelez maintenant la fonction d'extension

let label = UILabel()
let stringValue = "How to\ncontrol\nthe\nline spacing\nin UILabel"

// Pass value for any one argument - lineSpacing or lineHeightMultiple
label.setLineSpacing(lineSpacing: 2.0) .  // try values 1.0 to 5.0

// or try lineHeightMultiple
//label.setLineSpacing(lineHeightMultiple = 2.0) // try values 0.5 to 2.0


Ou en utilisant une instance de label (il suffit de copier et d'exécuter ce code pour voir le résultat)

let label = UILabel()
let stringValue = "Set\nUILabel\nline\nspacing"
let attrString = NSMutableAttributedString(string: stringValue)
var style = NSMutableParagraphStyle()
style.lineSpacing = 24 // change line spacing between paragraph like 36 or 48
style.minimumLineHeight = 20 // change line spacing between each line like 30 or 40

// Line spacing attribute
attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value: style, range: NSRange(location: 0, length: stringValue.characters.count))

// Character spacing attribute
attrString.addAttribute(NSAttributedStringKey.kern, value: 2, range: NSMakeRange(0, attrString.length))

label.attributedText = attrString

Swift 3

let label = UILabel()
let stringValue = "Set\nUILabel\nline\nspacing"
let attrString = NSMutableAttributedString(string: stringValue)
var style = NSMutableParagraphStyle()
style.lineSpacing = 24 // change line spacing between paragraph like 36 or 48
style.minimumLineHeight = 20 // change line spacing between each line like 30 or 40
attrString.addAttribute(NSParagraphStyleAttributeName, value: style, range: NSRange(location: 0, length: stringValue.characters.count))
label.attributedText = attrString
14
Krunal

Ce gars a créé une classe pour obtenir line-height (sans utiliser CoreText, en tant que bibliothèque MTLabel): https://github.com/LemonCake/MSLabel

8
Grsmto

La meilleure chose que j'ai trouvée est: https://github.com/mattt/TTTAttributedLabel

C'est une sous-classe UILabel, vous pouvez donc simplement l'insérer, puis changer la hauteur de la ligne:

myLabel.lineHeightMultiple = 0.85;
myLabel.leading = 2;
7
lms

J'ai trouvé des bibliothèques tierces comme celle-ci: 

https://github.com/Tuszy/MTLabel

Pour être la solution la plus simple.

4
Derek Bredensteiner

Voici un code Swift pour vous permettre de définir l'espacement des lignes par programme

let label = UILabel()

let attributedText = NSMutableAttributedString(string: "Your string")
let paragraphStyle = NSMutableParagraphStyle()

//SET THIS:
paragraphStyle.lineSpacing = 4
//OR SET THIS:
paragraphStyle.lineHeightMultiple = 4

//Or set both :)

let range = NSMakeRange(0, attributedText.length)
attributedText.addAttributes([NSParagraphStyleAttributeName : paragraphStyle], range: range)
label.attributedText = attributedText
1
ullstrm

Bien sûr, la réponse de Mike ne fonctionne pas si vous transmettez la chaîne par programmation. Dans ce cas, vous devez passer une chaîne attribuée et modifier son style.

NSMutableAttributedString * attrString = [[NSMutableAttributedString alloc] initWithString:@"Your \nregular \nstring"];
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
[style setLineSpacing:4];
[attrString addAttribute:NSParagraphStyleAttributeName
                   value:style
                   range:NSMakeRange(0, attrString.length)];
_label.attributedText = attrString;
0
Ricardo Mutti