Comment contrôler l'espacement des lignes dans UILabel

275

Est-il possible de réduire l'écart entre le texte, lorsqu'il est mis 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.

Abhinav
la source
2
Puis-je vous suggérer d'accepter l'une des réponses correctes pour iOS 6.0 et versions ultérieures? La réponse actuellement acceptée est obsolète.
Mark Amery
Pour chaque ligne, utilisez une nouvelle UILabel, puis incorporez toutes les étiquettes dans a StackView. Enfin, ajustez le spacingde StackView. N'oubliez pas de les empiler verticalement.
Honey
Reportez-vous au lien suivant pour la solution dans Swift 2. stackoverflow.com/a/39158698/6602495
Sneha
Reportez-vous à stackoverflow.com/a/44325650/342794 pour un ajustement du storyboard et d'autres détails.
lal

Réponses:

263

J'ai pensé à ajouter quelque chose de nouveau à cette réponse, donc je ne me sens pas aussi mal ... Voici une réponse Swift :

import Cocoa

let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 40

let attrString = NSMutableAttributedString(string: "Swift Answer")
attrString.addAttribute(.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))

var tableViewCell = NSTableCellView()
tableViewCell.textField.attributedStringValue = attrString

"Réponse courte: vous ne pouvez pas. Pour modifier l'espacement entre les lignes de texte, vous devrez sous-classer UILabel et lancer votre propre drawTextInRect, ou créer plusieurs étiquettes."

Voir: Définir l'espacement des lignes UILabel


Ceci est une réponse très 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.

Mazyod
la source
23
Depuis iOS 6.0, vous pouvez le contrôler via NSAttributedString(également disponible dans les propriétés de UILable dans le générateur d'interface de Xcode).
ıɾuǝʞ
13
Fait intéressant, pour autant que je sache, vous pouvez ajouter un espacement supplémentaire entre les lignes, mais pas le réduire via le NSParagraphStylelorsque vous utilisez un NSAttributedString. (Je devrais peut-être faire plus de tests sur les autres propriétés modifiables, mais la lineSpacingpropriété ne vous permet que de l'augmenter.)
livingtech
voir ma réponse pour voir un moyen d'utiliser NSAttributedString
d.ennis
2
@livingtech C'est exaspérant, et je pense que vous avez raison. Avez-vous trouvé des solutions?
Dom Vinyard
7
Juste pour clarifier quelque chose dans ce fil. Si vous souhaitez réduire l'espacement des lignes, définissez la hauteur de la ligne sur 1,0, puis définissezLineHeightMultiple sur une valeur inférieure <1,0, comme: [paragraphStyle setLineHeightMultiple: 0,8] ou paragraphStyle.lineHeightMultiple = 0,8
virsunen
401

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

entrez la description de l'image ici

Mike S
la source
1
Profitez plus des avantages du storyboard!
Allen
22
@PaperThick a le même problème dans 6.1.1. Il "harlem shake" pendant quelques minutes. Ne sait pas comment y remédier :) Xcode Shaking
Anton Gaenko
8
Existe-t-il un moyen de définir des polices personnalisées de cette façon? Je n'arrive pas à changer cette helvetica neue en une autre police.
Marcos Curvello
2
Si vous activez «Attribué», puis ouvrez le fichier en tant que code source, vous pouvez modifier manuellement le «lineHeightMultiple», et donc contourner le bogue Harlem Shake
ED-209
2
@azdev pour tous ceux qui regardent toujours cela, je suis sur le point d'obtenir plus de tremblements dans Xcode 7.3, mais je pense que c'est la première version où cela n'a pas été un problème
LulzCow
103

À partir d'iOS 6, vous pouvez définir une chaîne attribuée à UILabel. Vérifiez les points suivants:

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:label.text];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = spacing;
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, label.text.length)];

label.attributedText = attributedString;
iosMentalist
la source
1
Le attributedStringdoit être un NSMutableAttributedString(PAS NSAttributedString)
Mike S
14
Le premier code de ligne devrait êtreNSMutableAttributedString *attributedString = [NSMutableAttributedString alloc]initWithString:@"sample text"];
Allen
La lineSpacingpropriété du NSMutableParagraphStylen'est jamais négative, la hauteur de ligne ne peut donc pas être réduite avec cette approche. Pour répondre à la question, vous devez utiliser une autre propriété, voir la réponse @ d.ennis.
Theo
81

Les solutions énoncées ici n'ont pas fonctionné pour moi. J'ai trouvé une façon légèrement différente de le faire avec iOS 6 NSAttributeString:

myLabel.numberOfLines = 0; 
NSString* string = @"String with line one. \n Line two. \n Line three.";
NSMutableParagraphStyle *style  = [[NSMutableParagraphStyle alloc] init];
style.minimumLineHeight = 30.f;
style.maximumLineHeight = 30.f;
NSDictionary *attributtes = @{NSParagraphStyleAttributeName : style,};
myLabel.attributedText = [[NSAttributedString alloc] initWithString:string
                                                         attributes:attributtes];   
[myLabel sizeToFit];
d.ennis
la source
1
La hauteur de ligne dépend de la taille de la police. L'espacement des lignes est juste cela, l'espacement des lignes. Vous pouvez obtenir des résultats en définissant simplement la hauteur de ligne min / max, mais c'est uniquement parce que les tailles de police actuelles que vous utilisez ne sont pas supérieures aux limites de hauteur de ligne. Selon la documentation: "... les glyphes et les graphiques dépassant cette hauteur chevaucheront les lignes voisines ... Bien que cette limite s'applique à la ligne elle-même, l'espacement des lignes ajoute un espace supplémentaire entre les lignes adjacentes."
Ari Braginsky
+1, Si vous voulez réduire l'espacement entre les lignes, c'est ce que vous voulez faire. L'espacement réel des lignes est probablement 0 par défaut, c'est pourquoi les gens signalent que vous ne pouvez que l'augmenter. Le problème avec un espacement trop grand vient de la hauteur de ligne trop grande, c'est pourquoi cela fera le travail 99% du temps.
lawicko
1
C'est la seule réponse que j'ai pu trouver qui utilise la valeur de hauteur de ligne réelle (au lieu d'un rapport) commune aux applications de conception telles que Photoshop, Sketch, CSS, etc.
Albert Bori
35

J'ai créé cette extension simple 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 attrString = NSMutableAttributedString()
        if (self.attributedText != nil) {
            attrString.append( self.attributedText!)
        } else {
            attrString.append( NSMutableAttributedString(string: self.text!))
            attrString.addAttribute(NSAttributedStringKey.font, value: self.font, range: NSMakeRange(0, attrString.length))
        }
        attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
        self.attributedText = attrString
    }
}

Copiez ceci dans un fichier, vous pouvez donc l'utiliser comme ceci

myLabel.setLineHeight(0.7)
Agustin Meriles
la source
rappelez-vous que si vous faites cela pendant que vous utilisez également le Storyboard pour cette étiquette, assurez-vous de définir les lignes de votre étiquette sur 0
Honey
Pourquoi ne définissez-vous pas directement le lineSpacinget oubliez-vous le réglage lineHeightMultiple?
Honey
Parce que la clé pour réduire la hauteur de la ligne est 'lineHeightMultiple', pas de lineSpacing
Agustin Meriles
dites que vous voulez que la hauteur de votre ligne soit de 1,4, pourquoi ne pouvez-vous pas simplement écrire .lineSpacing = 1.4et tout oublier .lineHeightMultiple...
Honey
Hah! J'ai essayé, et je n'ai pas travaillé, mais je me demande pourquoi je ne vois pas d'autres réponses ici n'utilisant pas votre mécanisme, je veux dire qu'elles définissent directement la ligneSpacing. Voir la réponse acceptée ...
Honey
33

Depuis Interface Builder (Storyboard / XIB):

entrez 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 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 d'étiquette (il suffit de copier et d'exécuter ce code pour voir le résultat)

let label = UILabel()
let stringValue = "How to\ncontrol\nthe\nline spacing\nin UILabel"
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 = "How to\ncontrol\nthe\nline spacing\nin UILabel"
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
Krunal
la source
2
Ajoutez la ligne "paragraphStyle.alignment = self.textAlignment" pour conserver l'alignement d'origine. Sinon, le texte sera aligné à gauche.
Nithin Michael
Si vous perdez des points de suspension sur des textes volumineux, utilisez: paragraphStyle.lineBreakMode = .byTruncatingTail
christostsang
19

Il existe maintenant une autre solution dans iOS 6, qui consiste à définir attributText sur l'étiquette, à l'aide d'un NSAttributedString avec les styles de paragraphe appropriés. Voir cette réponse de débordement de pile pour plus de détails sur la hauteur de ligne avec NSAttributedString:

Texte de base - Hauteur de ligne NSAttributedString bien faite?

Dreamwieber
la source
16

Voici une classe qui sous-classe UILabel pour avoir la propriété line-height: https://github.com/LemonCake/MSLabel

adriendenat
la source
Cela a fonctionné pour moi, merci. J'ai également essayé d'utiliser MTLabel, mais celui-ci était meilleur.
Denis Kutlubaev
1
Est-ce que quelqu'un sait si MSLabel prend en charge le caractère '\ n'?
achi
12

En Swift et en fonction, inspiré de DarkDust

// Usage: setTextWithLineSpacing(myEpicUILabel,text:"Hello",lineSpacing:20)
func setTextWithLineSpacing(label:UILabel,text:String,lineSpacing:CGFloat)
{
    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineSpacing = lineSpacing

    let attrString = NSMutableAttributedString(string: text)
    attrString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))

    label.attributedText = attrString
}
Thyselius
la source
7

Selon la réponse de @Mike, la réduction du lineHeightMultipleest le point clé. Exemple ci-dessous, cela fonctionne bien pour moi:

    NSString* text = label.text;
    CGFloat textWidth = [text sizeWithAttributes:@{NSFontAttributeName: 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 !!!
        NSMutableAttributedString* attrText = [[NSMutableAttributedString alloc] initWithString:text];
        [attrText addAttribute:NSParagraphStyleAttributeName value:paragraph range:NSMakeRange(0, text.length)];
        label.attributedText = attrText;
    }
isaacselement
la source
6

Extension utile de SWIFT 3 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 attributeString = NSMutableAttributedString(string: text)
            let style = NSMutableParagraphStyle()

           style.lineSpacing = lineHeight
           attributeString.addAttribute(NSParagraphStyleAttributeName,
                                        value: style,
                                        range: NSMakeRange(0, text.characters.count))

           self.attributedText = attributeString
        }
    }
}
Kevin Sabbe
la source
5

J'ai trouvé un moyen de définir la hauteur réelle de la ligne (pas un facteur) et elle s'affiche 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.swiftet 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 attrString = NSMutableAttributedString(string: text!)
            attrString.addAttribute(NSAttributedStringKey.font, value: font, range: NSRange(location: 0, length: attrString.length))
            attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attrString.length))
            attributedText = attrString
        }
    }
}

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

Spécification de la classe à votre UILabel


Étape 3: Maintenant, vous devriez voir une nouvelle propriété dans le volet des propriétés nommée "Hauteur de ligne". Définissez simplement 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

Jeehut
la source
2

Voici une sous-classe de UILabel qui définit lineHeightMultipleet s'assure que la hauteur intrinsèque est suffisamment grande pour ne pas couper le texte.

@IBDesignable
class Label: UILabel {
    override var intrinsicContentSize: CGSize {
        var size = super.intrinsicContentSize
        let padding = (1.0 - lineHeightMultiple) * font.pointSize
        size.height += padding
        return size
    }

    override var text: String? {
        didSet {
            updateAttributedText()
        }
    }

    @IBInspectable var lineHeightMultiple: CGFloat = 1.0 {
        didSet {
            updateAttributedText()
        }
    }

    private func updateAttributedText() {
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineHeightMultiple = lineHeightMultiple
        attributedText = NSAttributedString(string: text ?? "", attributes: [
            .font: font,
            .paragraphStyle: paragraphStyle,
            .foregroundColor: textColor
        ])
        invalidateIntrinsicContentSize()
    }
}
phatmann
la source
le rembourrage supplémentaire doit être (lineHeightMultiple - 1.0) * font.pointSize, non?
Pavel Alexeev
Le code ci-dessus tel quel semble fonctionner pour moi. Mais vous avez peut-être raison. Avez-vous essayé votre changement? @PavelAlexeev
phatmann
Non, je reste avec lineSpacing au lieu de lineHeightMultiple :)
Pavel Alexeev
1

Dans Swift 2.0 ...

Ajoutez une extension:

extension UIView {
    func attributesWithLineHeight(font: String, color: UIColor, fontSize: CGFloat, kern: Double, lineHeightMultiple: CGFloat) -> [String: NSObject] {
        let titleParagraphStyle = NSMutableParagraphStyle()
        titleParagraphStyle.lineHeightMultiple = lineHeightMultiple

        let attribute = [
            NSForegroundColorAttributeName: color,
            NSKernAttributeName: kern,
            NSFontAttributeName : UIFont(name: font, size: fontSize)!,
            NSParagraphStyleAttributeName: titleParagraphStyle
        ]
        return attribute
    }
}

Maintenant, définissez simplement votre UILabel comme attributText:

self.label.attributedText = NSMutableAttributedString(string: "SwiftExample", attributes: attributesWithLineHeight("SourceSans-Regular", color: UIColor.whiteColor(), fontSize: 20, kern: 2.0, lineHeightMultiple: 0.5))    

Évidemment, j'ai ajouté un tas de paramètres dont vous n'avez peut-être pas besoin. Jouez - n'hésitez pas à réécrire la méthode - Je cherchais cela sur un tas de réponses différentes, donc je pensais publier toute l'extension au cas où cela aiderait quelqu'un là-bas ... -rab

rab_w
la source
1

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

J'ai ajouté du code pour conserver le texte attribué actuel si vous utilisez déjà des chaînes attribuées 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 attrString:NSMutableAttributedString
    if let attributed = self.attributedText {
        attrString = NSMutableAttributedString(attributedString: attributed)
    } else {
        attrString = NSMutableAttributedString(string: text)
        attrString.addAttribute(NSFontAttributeName, value: font, range: NSMakeRange(0, attrString.length))
    }
    attrString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
    self.attributedText = attrString
}
rmooney
la source
1

Une autre réponse ... Si vous passez la chaîne par programme, vous devez passer une chaîne attribuée à la place d'une chaîne régulière et changer son style. (IOS10)

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;
Ricardo Mutti
la source
1

Extension Swift 3:

    import UIKit

extension UILabel {
    func setTextWithLineSpacing(text: String, lineHeightMultiply: CGFloat = 1.3) {
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineHeightMultiple = lineHeightMultiply
        paragraphStyle.alignment = .center
        let attributedString = NSMutableAttributedString(string: text)
        attributedString.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: NSRange(location: 0, length: attributedString.length))
        self.attributedText = attributedString
    }
}
Roman Barzyczak
la source
1

Cela devrait vous aider. Vous pouvez ensuite attribuer votre étiquette à cette classe personnalisée dans le storyboard et utiliser ses paramètres 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 attrString = NSMutableAttributedString(string: self.text!)
            attrString.addAttribute(NSAttributedStringKey.font, value: self.font, range: NSMakeRange(0, attrString.length))
            attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
            self.attributedText = attrString
        }
    } 
}
Russell Warwick
la source
Cela devrait vous aider. Vous pouvez ensuite affecter votre étiquette à cette classe personnalisée dans le storyboard et utiliser ses paramètres directement dans les propriétés.
Russell Warwick
veuillez ne pas mettre de contenu lié à votre réponse dans les commentaires. votre réponse devrait être utile sans avoir à lire les commentaires
Neuron
1

Extension d'étiquette Swift 4. Création de NSMutableAttributedString avant de passer à la fonction au cas où des attributs supplémentaires seraient nécessaires pour le texte attribué.

extension UILabel {

    func setLineHeightMultiple(to height: CGFloat, withAttributedText attributedText: NSMutableAttributedString) {

        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = 1.0
        paragraphStyle.lineHeightMultiple = height
        paragraphStyle.alignment = textAlignment

        attributedText.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attributedText.length - 1))

        self.attributedText = attributedText
    }
}
Edward
la source
0

Ce code a fonctionné pour moi (ios 7 et ios 8 pour 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 *nameAttributes=@{
                               NSParagraphStyleAttributeName : paragraphStyle,
                               NSBaselineOffsetAttributeName:@2.0
                               };


NSAttributedString *string=[[NSAttributedString alloc] initWithString:@"22m\nago" attributes:nameAttributes];
_label.attributedText=string;
daniel kilinskas
la source
0

Voici ma solution rapidement. La sous-classe doit fonctionner à la fois pour AttributeText et la propriété text et pour characterSpacing + lineSpacing. Il conserve l'espacement si une nouvelle chaîne ou une chaîne attribuée 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: String? {
        set {
            super.text = newValue
            updateWithSpacing()
        }
        get {
            return super.text
        }
    }
    open override var attributedText: NSAttributedString? {
        set {
            super.attributedText = newValue
            updateWithSpacing() 
        }
        get {
            return super.attributedText
        }
    }
    func updateWithSpacing() {
        let attributedString = self.attributedText == nil ? NSMutableAttributedString(string: self.text ?? "") : NSMutableAttributedString(attributedString: attributedText!)
        attributedString.addAttribute(NSKernAttributeName, value: self.characterSpacing, range: NSRange(location: 0, length: attributedString.length))
        if lines_spacing >= 0 {
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.lineSpacing = lines_spacing
            paragraphStyle.alignment = textAlignment
            attributedString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))
        }
        super.attributedText = attributedString
    }
}
Umair
la source
-5

Comme solution de contournement rapide, simple et intelligente:

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

  1. Pour chaque ligne, écrivez une nouvelle étiquette.
  2. Intégrez-les dans un StackView (sélectionnez les deux étiquettes -> Editeur -> Incorporer dans -> StackView
  3. Ajustez le SpacingStackView à la quantité désirée

Assurez-vous de les empiler verticalement . Cette solution fonctionne également pour les polices personnalisées.

entrez la description de l'image ici

Mon chéri
la source
FWIW c'est une solution terrible mais réalisable. C'est pourquoi je le garde.
Honey
J'ai également vu un principe que les développeurs iOS utilisent des vues de pile pour créer des graphiques. Les vues de pile sont très puissantes
Honey