Comment contrôler l’interligne dans UILabel

Est-il possible de réduire l’écart entre le texte lorsqu’il est placé sur plusieurs lignes dans un UILabel ? Nous pouvons définir le cadre, la taille de la police et le nombre de lignes. Je veux réduire l’écart entre les deux lignes de cette étiquette.

J’ai pensé à append quelque chose de nouveau à cette réponse, donc je ne me sens pas aussi mal… Voici une réponse rapide :

 import Cocoa let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineSpacing = 40 let attrSsortingng = NSMutableAtsortingbutedSsortingng(ssortingng: "Swift Answer") attrSsortingng.addAtsortingbute(.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrSsortingng.length)) var tableViewCell = NSTableCellView() tableViewCell.textField.atsortingbutedSsortingngValue = attrSsortingng 

“Réponse courte: vous ne le pouvez pas. Pour modifier l’espacement entre les lignes de texte, vous devez sous-classer UILabel et créer votre propre drawTextInRect ou créer plusieurs étiquettes.”

Voir: Définir l’interligne UILabel


C’est une réponse vraiment ancienne, et d’autres ont déjà ajouté la nouvelle et meilleure façon de gérer cela. Veuillez consulter les réponses à jour fournies ci-dessous.

Dans Xcode 6, vous pouvez le faire dans le storyboard:

entrer la description de l'image ici

A partir d’iOS 6, vous pouvez définir une chaîne atsortingbuée à UILabel. Vérifiez les éléments suivants:

 NSMutableAtsortingbutedSsortingng *atsortingbutedSsortingng = [[NSMutableAtsortingbutedSsortingng alloc] initWithSsortingng:label.text]; NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; paragraphStyle.lineSpacing = spacing; [atsortingbutedSsortingng addAtsortingbute:NSParagraphStyleAtsortingbuteName value:paragraphStyle range:NSMakeRange(0, label.text.length)]; label.atsortingbutedText = atsortingbutedSsortingng; 

Les solutions énoncées ici n’ont pas fonctionné pour moi. J’ai trouvé une manière légèrement différente de le faire avec iOS 6 NSAtsortingbuteSsortingng:

 myLabel.numberOfLines = 0; NSSsortingng* ssortingng = @"Ssortingng with line one. \n Line two. \n Line three."; NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; style.minimumLineHeight = 30.f; style.maximumLineHeight = 30.f; NSDictionary *atsortingbuttes = @{NSParagraphStyleAtsortingbuteName : style,}; myLabel.atsortingbutedText = [[NSAtsortingbutedSsortingng alloc] initWithSsortingng:ssortingng atsortingbutes:atsortingbuttes]; [myLabel sizeToFit]; 

J’ai fait cette simple extension qui fonctionne très bien pour moi:

 extension UILabel { func setLineHeight(lineHeight: CGFloat) { let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineSpacing = 1.0 paragraphStyle.lineHeightMultiple = lineHeight paragraphStyle.alignment = self.textAlignment let attrSsortingng = NSMutableAtsortingbutedSsortingng() if (self.atsortingbutedText != nil) { attrSsortingng.append( self.atsortingbutedText!) } else { attrSsortingng.append( NSMutableAtsortingbutedSsortingng(ssortingng: self.text!)) attrSsortingng.addAtsortingbute(NSAtsortingbutedSsortingngKey.font, value: self.font, range: NSMakeRange(0, attrSsortingng.length)) } attrSsortingng.addAtsortingbute(NSAtsortingbutedSsortingngKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrSsortingng.length)) self.atsortingbutedText = attrSsortingng } } 

Copiez ceci dans un fichier, alors vous pouvez l’utiliser comme ça

 myLabel.setLineHeight(0.7) 

Il existe maintenant une autre réponse dans iOS 6, qui consiste à définir atsortingbutsText sur l’étiquette, en utilisant un NSAtsortingbutedSsortingng avec les styles de paragraphe appropriés. Voir cette réponse de dépassement de stack pour plus de détails sur la hauteur de ligne avec NSAtsortingbutedSsortingng:

Core Text – Hauteur de ligne NSAtsortingbutedSsortingng effectuée correctement?

Voici une classe que la sous-classe UILabel possède une propriété de hauteur de ligne: https://github.com/LemonCake/MSLabel

De Interface Builder (Storyboard / XIB):

entrer la description de l'image ici

Par programme:

SWift 4

Utilisation de l’extension d’étiquette

 extension UILabel { // Pass value for any one of both parameters and see result 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 atsortingbutedSsortingng:NSMutableAtsortingbutedSsortingng if let labelatsortingbutedText = self.atsortingbutedText { atsortingbutedSsortingng = NSMutableAtsortingbutedSsortingng(atsortingbutedSsortingng: labelatsortingbutedText) } else { atsortingbutedSsortingng = NSMutableAtsortingbutedSsortingng(ssortingng: labelText) } // Line spacing atsortingbute atsortingbutedSsortingng.addAtsortingbute(NSAtsortingbutedSsortingngKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, atsortingbutedSsortingng.length)) self.atsortingbutedText = atsortingbutedSsortingng } } 

Appelez maintenant la fonction d’extension

 let label = UILabel() let ssortingngValue = "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 (il suffit de copier et d’exécuter ce code pour voir le résultat)

 let label = UILabel() let ssortingngValue = "How to\ncontrol\nthe\nline spacing\nin UILabel" let attrSsortingng = NSMutableAtsortingbutedSsortingng(ssortingng: ssortingngValue) 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 atsortingbute attrSsortingng.addAtsortingbute(NSAtsortingbutedSsortingngKey.paragraphStyle, value: style, range: NSRange(location: 0, length: ssortingngValue.characters.count)) // Character spacing atsortingbute attrSsortingng.addAtsortingbute(NSAtsortingbutedSsortingngKey.kern, value: 2, range: NSMakeRange(0, attrSsortingng.length)) label.atsortingbutedText = attrSsortingng 

Swift 3

 let label = UILabel() let ssortingngValue = "How to\ncontrol\nthe\nline spacing\nin UILabel" let attrSsortingng = NSMutableAtsortingbutedSsortingng(ssortingng: ssortingngValue) 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 attrSsortingng.addAtsortingbute(NSParagraphStyleAtsortingbuteName, value: style, range: NSRange(location: 0, length: ssortingngValue.characters.count)) label.atsortingbutedText = attrSsortingng 

Dans Swift et en tant que fonction, inspiré par DarkDust

 // Usage: setTextWithLineSpacing(myEpicUILabel,text:"Hello",lineSpacing:20) func setTextWithLineSpacing(label:UILabel,text:Ssortingng,lineSpacing:CGFloat) { let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineSpacing = lineSpacing let attrSsortingng = NSMutableAtsortingbutedSsortingng(ssortingng: text) attrSsortingng.addAtsortingbute(NSParagraphStyleAtsortingbuteName, value:paragraphStyle, range:NSMakeRange(0, attrSsortingng.length)) label.atsortingbutedText = attrSsortingng } 

Selon la réponse de @Mike, la réduction de la lineHeightMultiple est le point clé. Exemple ci-dessous, ça marche bien pour moi:

  NSSsortingng* text = label.text; CGFloat textWidth = [text sizeWithAtsortingbutes:@{NSFontAtsortingbuteName: label.font}].width; if (textWidth > label.frame.size.width) { NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init]; paragraph.alignment = NSTextAlignmentCenter; paragraph.lineSpacing = 1.0f; paragraph.lineHeightMultiple = 0.75; // Reduce this value !!! NSMutableAtsortingbutedSsortingng* attrText = [[NSMutableAtsortingbutedSsortingng alloc] initWithSsortingng:text]; [attrText addAtsortingbute:NSParagraphStyleAtsortingbuteName value:paragraph range:NSMakeRange(0, text.length)]; label.atsortingbutedText = attrText; } 

SWIFT 3 extension utile pour définir plus facilement l’espace entre les lignes 🙂

 extension UILabel { func setLineHeight(lineHeight: CGFloat) { let text = self.text if let text = text { let atsortingbuteSsortingng = NSMutableAtsortingbutedSsortingng(ssortingng: text) let style = NSMutableParagraphStyle() style.lineSpacing = lineHeight atsortingbuteSsortingng.addAtsortingbute(NSParagraphStyleAtsortingbuteName, value: style, range: NSMakeRange(0, text.characters.count)) self.atsortingbutedText = atsortingbuteSsortingng } } } 

Dans Swift 2.0 …

Ajouter une extension:

 extension UIView { func atsortingbutesWithLineHeight(font: Ssortingng, color: UIColor, fontSize: CGFloat, kern: Double, lineHeightMultiple: CGFloat) -> [Ssortingng: NSObject] { let titleParagraphStyle = NSMutableParagraphStyle() titleParagraphStyle.lineHeightMultiple = lineHeightMultiple let atsortingbute = [ NSForegroundColorAtsortingbuteName: color, NSKernAtsortingbuteName: kern, NSFontAtsortingbuteName : UIFont(name: font, size: fontSize)!, NSParagraphStyleAtsortingbuteName: titleParagraphStyle ] return atsortingbute } } 

Maintenant, il suffit de définir votre UILabel comme atsortingbuéText:

 self.label.atsortingbutedText = NSMutableAtsortingbutedSsortingng(ssortingng: "SwiftExample", atsortingbutes: atsortingbutesWithLineHeight("SourceSans-Regular", color: UIColor.whiteColor(), fontSize: 20, kern: 2.0, lineHeightMultiple: 0.5)) 

Evidemment, j’ai ajouté un tas de parameters dont vous n’avez peut-être pas besoin. Jouez – n’hésitez pas à réécrire la méthode – je cherchais ceci sur un tas de réponses différentes, donc je pensais que je posterais la totalité de l’extension au cas où cela aiderait quelqu’un …

Swift3 – Dans une extension UITextView ou UILabel, ajoutez cette fonction:

J’ai ajouté du code pour conserver le texte atsortingbué actuel si vous utilisez déjà des chaînes avec la vue (au lieu de les écraser).

 func setLineHeight(_ lineHeight: CGFloat) { guard let text = self.text, let font = self.font else { return } let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineSpacing = 1.0 paragraphStyle.lineHeightMultiple = lineHeight paragraphStyle.alignment = self.textAlignment var attrSsortingng:NSMutableAtsortingbutedSsortingng if let atsortingbuted = self.atsortingbutedText { attrSsortingng = NSMutableAtsortingbutedSsortingng(atsortingbutedSsortingng: atsortingbuted) } else { attrSsortingng = NSMutableAtsortingbutedSsortingng(ssortingng: text) attrSsortingng.addAtsortingbute(NSFontAtsortingbuteName, value: font, range: NSMakeRange(0, attrSsortingng.length)) } attrSsortingng.addAtsortingbute(NSParagraphStyleAtsortingbuteName, value:paragraphStyle, range:NSMakeRange(0, attrSsortingng.length)) self.atsortingbutedText = attrSsortingng } 

Une autre réponse … Si vous transmettez la chaîne par programmation, vous devez passer une chaîne atsortingbuée à la place d’une chaîne normale et modifier son style. (IOS10)

 NSMutableAtsortingbutedSsortingng * attrSsortingng = [[NSMutableAtsortingbutedSsortingng alloc] initWithSsortingng:@"Your \nregular \nssortingng"]; NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; [style setLineSpacing:4]; [attrSsortingng addAtsortingbute:NSParagraphStyleAtsortingbuteName value:style range:NSMakeRange(0, attrSsortingng.length)]; _label.atsortingbutedText = attrSsortingng; 

J’ai trouvé un moyen de définir la hauteur de ligne réelle (pas un facteur) et elle restitue même en direct dans Interface Builder . Suivez simplement les instructions ci-dessous. Le code est écrit en swift 4 .


Étape # 1: Créez un fichier nommé DesignableLabel.swift et insérez le code suivant:

 import UIKit @IBDesignable class DesignableLabel: UILabel { @IBInspectable var lineHeight: CGFloat = 20 { didSet { let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.minimumLineHeight = lineHeight paragraphStyle.maximumLineHeight = lineHeight paragraphStyle.alignment = self.textAlignment let attrSsortingng = NSMutableAtsortingbutedSsortingng(ssortingng: text!) attrSsortingng.addAtsortingbute(NSAtsortingbutedSsortingngKey.font, value: font, range: NSRange(location: 0, length: attrSsortingng.length)) attrSsortingng.addAtsortingbute(NSAtsortingbutedSsortingngKey.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attrSsortingng.length)) atsortingbutedText = attrSsortingng } } } 

Étape # 2: Placez un UILabel dans un Storyboard / XIB et définissez sa classe sur DesignableLabel . Attendez que votre projet soit construit (la construction doit réussir!).

Spécifier la classe à votre UILabel


Étape 3: Maintenant, vous devriez voir une nouvelle propriété dans le volet des propriétés nommé “Line Height”. Il suffit de définir la valeur que vous aimez et vous devriez voir les résultats immédiatement!

Définir la hauteur de ligne dans les propriétés

Ce code a fonctionné pour moi (ios 7 et ios 8 à coup sûr).

 _label.numberOfLines=2; _label.textColor=[UIColor whiteColor]; NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; paragraphStyle.lineHeightMultiple=0.5; paragraphStyle.alignment = NSTextAlignmentCenter; paragraphStyle.lineSpacing = 1.0; NSDictionary *nameAtsortingbutes=@{ NSParagraphStyleAtsortingbuteName : paragraphStyle, NSBaselineOffsetAtsortingbuteName:@2.0 }; NSAtsortingbutedSsortingng *ssortingng=[[NSAtsortingbutedSsortingng alloc] initWithSsortingng:@"22m\nago" atsortingbutes:nameAtsortingbutes]; _label.atsortingbutedText=ssortingng; 

Extension Swift 3:

  import UIKit extension UILabel { func setTextWithLineSpacing(text: Ssortingng, lineHeightMultiply: CGFloat = 1.3) { let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineHeightMultiple = lineHeightMultiply paragraphStyle.alignment = .center let atsortingbutedSsortingng = NSMutableAtsortingbutedSsortingng(ssortingng: text) atsortingbutedSsortingng.addAtsortingbute(NSParagraphStyleAtsortingbuteName, value: paragraphStyle, range: NSRange(location: 0, length: atsortingbutedSsortingng.length)) self.atsortingbutedText = atsortingbutedSsortingng } } 

Cela devrait aider avec ça. Vous pouvez ensuite atsortingbuer votre étiquette à cette classe personnalisée dans le storyboard et utiliser ses parameters directement dans les propriétés:

 open class SpacingLabel : UILabel { @IBInspectable open var lineHeight:CGFloat = 1 { didSet { let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineSpacing = 1.0 paragraphStyle.lineHeightMultiple = self.lineHeight paragraphStyle.alignment = self.textAlignment let attrSsortingng = NSMutableAtsortingbutedSsortingng(ssortingng: self.text!) attrSsortingng.addAtsortingbute(NSAtsortingbutedSsortingngKey.font, value: self.font, range: NSMakeRange(0, attrSsortingng.length)) attrSsortingng.addAtsortingbute(NSAtsortingbutedSsortingngKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrSsortingng.length)) self.atsortingbutedText = attrSsortingng } } } 

Voici une sous-classe de UILabel qui définit lineHeightMultiple et lineHeightMultiple que la hauteur insortingnsèque est suffisamment importante pour ne pas couper le texte.

 @IBDesignable class Label: UILabel { override var insortingnsicContentSize: CGSize { var size = super.insortingnsicContentSize let padding = (1.0 - lineHeightMultiple) * font.pointSize size.height += padding return size } override var text: Ssortingng? { didSet { updateAtsortingbutedText() } } @IBInspectable var lineHeightMultiple: CGFloat = 1.0 { didSet { updateAtsortingbutedText() } } private func updateAtsortingbutedText() { let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineHeightMultiple = lineHeightMultiple atsortingbutedText = NSAtsortingbutedSsortingng(ssortingng: text ?? "", atsortingbutes: [ .font: font, .paragraphStyle: paragraphStyle, .foregroundColor: textColor ]) invalidateInsortingnsicContentSize() } } 

Extension d’étiquette Swift 4. Créer NSMutableAtsortingbutedSsortingng avant de passer en fonction au cas où des atsortingbuts supplémentaires seraient requirejs pour le texte atsortingbué.

 extension UILabel { func setLineHeightMultiple(to height: CGFloat, withAtsortingbutedText atsortingbutedText: NSMutableAtsortingbutedSsortingng) { let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineSpacing = 1.0 paragraphStyle.lineHeightMultiple = height paragraphStyle.alignment = textAlignment atsortingbutedText.addAtsortingbute(.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: atsortingbutedText.length - 1)) self.atsortingbutedText = atsortingbutedText } } 

Voici ma solution rapide. La sous-classe doit fonctionner à la fois pour la propriété atsortingbutsText et pour la propriété text ainsi que pour characterSpacing + lineSpacing. Il conserve l’espacement si une nouvelle chaîne ou atsortingbutSsortingng est définie.

 open class UHBCustomLabel : UILabel { @IBInspectable open var characterSpacing:CGFloat = 1 { didSet { updateWithSpacing() } } @IBInspectable open var lines_spacing:CGFloat = -1 { didSet { updateWithSpacing() } } open override var text: Ssortingng? { set { super.text = newValue updateWithSpacing() } get { return super.text } } open override var atsortingbutedText: NSAtsortingbutedSsortingng? { set { super.atsortingbutedText = newValue updateWithSpacing() } get { return super.atsortingbutedText } } func updateWithSpacing() { let atsortingbutedSsortingng = self.atsortingbutedText == nil ? NSMutableAtsortingbutedSsortingng(ssortingng: self.text ?? "") : NSMutableAtsortingbutedSsortingng(atsortingbutedSsortingng: atsortingbutedText!) atsortingbutedSsortingng.addAtsortingbute(NSKernAtsortingbuteName, value: self.characterSpacing, range: NSRange(location: 0, length: atsortingbutedSsortingng.length)) if lines_spacing >= 0 { let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineSpacing = lines_spacing paragraphStyle.alignment = textAlignment atsortingbutedSsortingng.addAtsortingbute(NSParagraphStyleAtsortingbuteName, value:paragraphStyle, range:NSMakeRange(0, atsortingbutedSsortingng.length)) } super.atsortingbutedText = atsortingbutedSsortingng } } 

En guise de solution de contournement rapide, malpropre et simple:

Pour les UILabels qui n’ont pas beaucoup de lignes, vous pouvez utiliser à la place des stackViews.

  1. Pour chaque ligne, écrivez une nouvelle étiquette.
  2. Incorporez-les à un StackView (sélectionnez les deux libellés -> Editeur -> Intégrer dans -> StackView
  3. Ajustez l’ Spacing du StackView à la quantité désirée

Assurez-vous de les emstackr verticalement . Cette solution fonctionne également pour les fonts personnalisées.

entrer la description de l'image ici