it-swarm.com.de

So steuern Sie den Zeilenabstand in UILabel

Ist es möglich, die Lücke zwischen Text zu reduzieren, wenn in einer UILabel mehrere Zeilen eingefügt werden? Wir können den Rahmen, die Schriftgröße und die Anzahl der Zeilen festlegen. Ich möchte die Lücke zwischen den beiden Zeilen in diesem Etikett verringern.

232
Abhinav

Ich dachte darüber nach, dieser Antwort etwas Neues hinzuzufügen, also fühle ich mich nicht so schlecht ... Hier ist eine Swift Antwort:

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

"Kurze Antwort: Das geht nicht. Um den Abstand zwischen den Textzeilen zu ändern, müssen Sie die UILabel-Klasse definieren und Ihr eigenes drawTextInRect-Objekt rollen oder mehrere Beschriftungen erstellen."

Siehe: UILabel-Zeilenabstand einstellen


Dies ist eine wirklich alte Antwort, und andere haben bereits den neuen und besseren Weg hinzugefügt, um damit umzugehen. Bitte sehen Sie sich die aktuellen Antworten unten an. </ Strike>

230
Mazyod

In Xcode 6 können Sie dies im Storyboard tun:

enter image description here

376
Mike S

Ab iOS 6 können Sie dem UILabel einen Attribut-String zuweisen. Überprüfe das Folgende : 

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;
98
iosMentalist

Die hier genannten Lösungen haben für mich nicht funktioniert. Mit dem iOS 6 NSAttributeString habe ich einen etwas anderen Weg gefunden:

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];
79
d.ennis

Ich habe diese einfache Erweiterung gemacht, die für mich sehr gut funktioniert:

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
    }
}

Kopieren Sie dies in eine Datei, damit Sie es so verwenden können

myLabel.setLineHeight(0.7)
29
Agustin Meriles

Aus dem Interface Builder (Storyboard/XIB):

enter image description here

Programmatisch:

Swift 4

Etikettenerweiterung verwenden

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
    }
}

Rufen Sie jetzt die Nebenstellenfunktion an

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

Oder mit Label-Instanz (Kopieren Sie diesen Code einfach und führen Sie ihn aus, um das Ergebnis anzuzeigen)

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
20
Krunal

In iOS 6 gibt es jetzt eine alternative Antwort: Setzen Sie attributedText auf dem Etikett, indem Sie einen NSAttributedString mit den entsprechenden Absatzformaten verwenden. Informationen zur Zeilenhöhe mit NSAttributedString finden Sie in dieser Antwort zum Stack-Überlauf:

Core Text - NSAttributedString Zeilenhöhe richtig gemacht?

19
Dreamwieber

Hier ist eine Klasse, die eine UILabel-Unterklasse enthält, um eine Eigenschaft mit Zeilenhöhe zu erhalten: https://github.com/LemonCake/MSLabel

16
Grsmto

In Swift und als Funktion, inspiriert von 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(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attrString.length))

    label.attributedText = attrString
}
8
Thyselius

Laut der Antwort von @Mike ist das Reduzieren von lineHeightMultiple der Schlüsselpunkt. Beispiel unten, es funktioniert gut für mich:

    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;
    }
6
isaacselement

Swift 3 nützliche Erweiterung, um den Abstand zwischen den Zeilen einfacher einzustellen :)

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
        }
    }
}
5
Kevin Sabbe

Ich habe einen Weg gefunden, auf dem Sie die tatsächliche Zeilenhöhe (keinen Faktor) einstellen können, und es wird sogar live in Interface Builder dargestellt. Folgen Sie einfach den Anweisungen unten. Code wird in Swift 4 geschrieben.


Schritt 1: Erstellen Sie eine Datei mit dem Namen DesignableLabel.Swift und fügen Sie den folgenden Code ein:

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
        }
    }
}

Schritt 2: Platzieren Sie eine UILabel in einem Storyboard/XIB und setzen Sie ihre Klasse auf DesignableLabel. Warten Sie, bis Ihr Projekt erstellt wurde (Build muss erfolgreich sein!).

 Specifying the class to your UILabel


Schritt 3: Jetzt sollte im Eigenschaftenbereich eine neue Eigenschaft mit dem Namen "Zeilenhöhe" angezeigt werden. Legen Sie einfach den gewünschten Wert fest und Sie sollten sehen Sie die Ergebnisse sofort!

 Set Line Height in properties

2
Dschee

Swift3 - Fügen Sie in einer UITextView- oder UILabel-Erweiterung diese Funktion hinzu:

Ich habe Code hinzugefügt, um den aktuellen attributierten Text beizubehalten, wenn Sie bereits attributierte Zeichenfolgen mit der Ansicht verwenden (anstatt sie zu überschreiben).

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
}
1
rmooney

Swift 3 Erweiterung: 

    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
    }
}
1
Roman Barzyczak

Eine andere Antwort ... Wenn Sie die Zeichenfolge programmgesteuert übergeben, müssen Sie anstelle einer regulären Zeichenfolge eine attributierte Zeichenfolge übergeben und deren Stil ändern. (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;
1
Ricardo Mutti

In Swift 2.0 ...

Fügen Sie eine Erweiterung hinzu: 

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
    }
}

Legen Sie nun Ihr UILabel als attributedText fest: 

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

Natürlich habe ich eine Reihe von Parametern hinzugefügt, die Sie möglicherweise nicht benötigen. Spielen Sie herum - fühlen Sie sich frei, um die Methode neu zu schreiben - ich habe dies auf einer Reihe von verschiedenen Antworten gesucht, die so gedacht waren, dass ich die gesamte Erweiterung posten würde, falls sie jemandem da draußen hilft ... -rab

1
rab_w

Dieser Code hat für mich funktioniert (ios 7 & ios 8 sicher).

_label.numberOfLines=2;
_label.textColor=[UIColor whiteColor];

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineHeightMultiple=0.5;
paragraphStyle.alignment = NSTextAlignmentCenter;
paragraphStyle.lineSpacing = 1.0;

NSDictionary *[email protected]{
                               NSParagraphStyleAttributeName : paragraphStyle,
                               NSBaselineOffsetAttributeName:@2.0
                               };


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

Das sollte dabei helfen. Sie können Ihr Label dieser benutzerdefinierten Klasse innerhalb des Storyboards zuweisen und dessen Parameter direkt in den Eigenschaften verwenden:

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
        }
    } 
}
0
Russell Warwick

Hier ist eine Unterklasse von UILabel, die lineHeightMultiple setzt und sicherstellt, dass die intrinsische Höhe groß genug ist, um Text nicht abzuschneiden.

@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()
    }
}
0
phatmann

Hier ist meine Lösung in Swift. Die Unterklasse sollte sowohl für die Attribute attributedText und text als auch für characterSpacing + lineSpacing funktionieren. Er behält den Abstand bei, wenn eine neue Zeichenfolge oder attributedString gesetzt wird.

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
    }
}
0
Umair

Swift 4 Label Erweiterung. Erstellen von NSMutableAttributedString vor dem Übergeben an function, falls zusätzliche Attribute für den attributierten Text erforderlich sind.

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
    }
}
0
Edward