Réponses:
Edit: Évidemment, le NSAttributedString
fera, sur iOS 6 et versions ultérieures. Au lieu d'utiliser un NSString
pour définir le texte de l'étiquette, créez un NSAttributedString
, définissez des attributs dessus, puis définissez-le comme .attributedText
sur l'étiquette. Le code que vous voulez sera quelque chose comme 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 a fait la même chose, mais c'est maintenant obsolète.
Pour des raisons historiques, voici ma réponse initiale:
Réponse courte: vous ne pouvez pas. Pour modifier l'espacement entre les lignes de texte, vous devrez sous UILabel
- classer et rouler les vôtres 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 de l'imprimé et en ligne, l'espace entre les lignes de texte est appelé «leader» (rime avec «titre» et provient du métal de plomb utilisé il y a des décennies). Leading est une propriété en lecture seule de UIFont
, qui était obsolète dans la version 4.0 et remplacée par lineHeight
. Autant que je sache, il n'y a 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
's tel quel, donc je suggère 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.
J'aurais aimé qu'il y ait plus de flexibilité UILabel
et je serais heureux d'avoir tort!
À partir d'ios 6, vous pouvez définir une chaîne attribuée dans le 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 ;
AttributedString
désactive par exemple l'alignement du texte de l'étiquette, vous devez donc l'ajouter au style de paragraphe.
Vous pouvez contrôler l'espacement des lignes dans le storyboard:
Depuis Interface Builder:
Par programme:
SWift 4
Utilisation de 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
}
}
Maintenant, appelez 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 d'étiquette (copiez et exécutez simplement 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
Ma solution était de patcher le fichier de police lui-même et de fixer définitivement sa 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).
Ce gars a créé une classe pour obtenir la hauteur de ligne (sans utiliser CoreText, comme 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 la déposer, puis modifier 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 rapide pour vous permettre de définir l'interligne par programmation
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 passez la chaîne par programme. Dans ce cas, vous devez passer une chaîne attribuée et changer 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;