Comment puis-je modifier l'espace entre les lignes (interligne) dans une ligne multiple UILabel
?
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!
À 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 ;
Vous pouvez contrôler l’espacement des lignes dans le storyboard:
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).
De Interface Builder:
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
Ce gars a créé une classe pour obtenir line-height (sans utiliser CoreText, en tant que bibliothèque MTLabel): https://github.com/LemonCake/MSLabel
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;
J'ai trouvé des bibliothèques tierces comme celle-ci:
https://github.com/Tuszy/MTLabel
Pour être la solution la plus simple.
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
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;