Jak zwiększyć odstępy między wierszami w UILabel w języku Swift

94

Mam etykietę zawierającą kilka wierszy tekstu i chcę zwiększyć odstępy między wierszami. Inni zadają podobne pytania, ale rozwiązania nie rozwiązują moich problemów. Również moja etykieta może zawierać akapity lub nie. Jestem nowy Swift. Czy istnieje rozwiązanie wykorzystujące scenorys? Czy tylko przez to, NSAttributedStringże jest to możliwe?

Sneha
źródło

Odpowiedzi:

175

Programowo dodaj odstępy między wierszami do UILabelponiższego fragmentu kodu .

Wcześniejsza wersja Swift

let attributedString = NSMutableAttributedString(string: "Your text")

// *** Create instance of `NSMutableParagraphStyle`
let paragraphStyle = NSMutableParagraphStyle()

// *** set LineSpacing property in points ***
paragraphStyle.lineSpacing = 2 // Whatever line spacing you want in points

// *** Apply attribute to string ***
attributedString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

// *** Set Attributed String to your label ***
label.attributedText = attributedString

Swift 4.0

let attributedString = NSMutableAttributedString(string: "Your text")

// *** Create instance of `NSMutableParagraphStyle`
let paragraphStyle = NSMutableParagraphStyle()

// *** set LineSpacing property in points ***
paragraphStyle.lineSpacing = 2 // Whatever line spacing you want in points

// *** Apply attribute to string ***
attributedString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

// *** Set Attributed String to your label ***
label.attributedText = attributedString

Swift 4.2

let attributedString = NSMutableAttributedString(string: "Your text")

// *** Create instance of `NSMutableParagraphStyle`
let paragraphStyle = NSMutableParagraphStyle()

// *** set LineSpacing property in points ***
paragraphStyle.lineSpacing = 2 // Whatever line spacing you want in points

// *** Apply attribute to string ***
attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

// *** Set Attributed String to your label ***
label.attributedText = attributedString
Dipen Panchasara
źródło
3
To pokazuje błąd „Wartość typu„ NSAttributedString ”nie ma elementu członkowskiego„ addAttribute ””.
Sneha
2
NSMutableAttributedStringZamiast tego musimy użyć NSAttributedString. Zaktualizowałem odpowiedź.
Dipen Panchasara
1
Pracuj z niestandardowymi czcionkami również świetne @ Dipen Panchasara
Abdul Karim
7
Nie wiem dlaczego, ale jak dla mnie to działa tylko jeśli ustawisz odstępy> = 1, próbowałem ustawić 0,5 / 0,75, nie ma to żadnego efektu
Aximem.
2
Nie ma potrzeby NSMutableAttributedString. Można użyćNSAttributedString(string: "Your text", attributes: [NSAttributedString.Key.paragraphStyle : paragraphStyle])
bauerMusic
101

Z programu Interface Builder:

wprowadź opis obrazu tutaj

Programowo:

SWift 4 i 4.2

Korzystanie z rozszerzenia etykiety

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

        // (Swift 4.2 and above) Line spacing attribute
        attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))


        // (Swift 4.1 and 4.0) Line spacing attribute
        attributedString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

        self.attributedText = attributedString
    }
}

Teraz funkcja rozszerzenia połączeń

let label = UILabel()
let stringValue = "Set\nUILabel\nline\nspacing"

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

Lub za pomocą instancji etykiety (po prostu skopiuj i wykonaj ten kod, aby zobaczyć wynik)

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

Szybki 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
Krunal
źródło
W „NSAttributedStringKey.paragraphStyle” wystąpił błąd, zamiast tego użyłem „NSParagraphStyleAttributeName”.
Ahmadreza,
@Alfi - To różnica w wersji językowej Swift. Twój projekt jest szybki. wersja może być swift 3.x i tutaj są odpowiedzi dla obu wersji. Spróbuj z kodem Swift 3.
Krunal
Hii @krunal, ustawiłem Linespacing i LineHeight w Interface i ustawiłem tekst w UILabel Programmatycznie, ale to nie działa. jeśli dodam tekst w interfejsie, to zadziała. czy możesz mi pomóc w tej sprawie Dziękuję i ustawiłem również atrybut attributeText i tekst w UILabel, ale to podejście nie działa dla mnie.
Yogesh Patel
Rozwiązanie do tworzenia interfejsu jest przeznaczone tylko dla tekstu statycznego. kiedy dodajemy przypisany ciąg w kodzie, atrybut, który jest dodawany z konstruktora interfejsu, nie jest stosowany.
Yodagama
66

Możesz kontrolować odstępy między wierszami w programie storyboard.

wprowadź opis obrazu tutaj

To samo pytanie.

pkc456
źródło
8
Właściwie to próbowałem. Ale to nie działa. Nie jest to również przydatne w przypadku czcionek niestandardowych.
Sneha
Jeśli masz problemy z wyrównaniem czcionek niestandardowych, spróbuj zaktualizować ascenderwłaściwość, jak wspomniano tutaj .
pkc456
1
To nie jest problem niewspółosiowości. Nie mogę wybrać swojej niestandardowej czcionki za pomocą rozwiązania, które powiedziałeś @ pkc456
Sneha
To nie jest problem z niewspółosiowością. Nie mogłem wybrać niestandardowej czcionki, ale teraz rozwiązałem to, dodając moją czcionkę osobno w ustawieniach w Attributed. Ale nadal odstępy pozostają takie same. @ Pkc456
Sneha
15
Dotyczy to tylko tekstu statycznego. Spróbuj dodać tekst w sposób programowy. To nie zadziała.
Sneha
11

Najnowsze rozwiązanie dla Swift 5.0

private extension UILabel {

    // MARK: - spacingValue is spacing that you need
    func addInterlineSpacing(spacingValue: CGFloat = 2) {

        // MARK: - Check if there's any text
        guard let textString = text else { return }

        // MARK: - Create "NSMutableAttributedString" with your text
        let attributedString = NSMutableAttributedString(string: textString)

        // MARK: - Create instance of "NSMutableParagraphStyle"
        let paragraphStyle = NSMutableParagraphStyle()

        // MARK: - Actually adding spacing we need to ParagraphStyle
        paragraphStyle.lineSpacing = spacingValue

        // MARK: - Adding ParagraphStyle to your attributed String
        attributedString.addAttribute(
            .paragraphStyle,
            value: paragraphStyle,
            range: NSRange(location: 0, length: attributedString.length
        ))

        // MARK: - Assign string that you've modified to current attributed Text
        attributedText = attributedString
    }

}

I użycie:

let yourLabel = UILabel()
let yourText = "Hello \n world \n !"
yourLabel.text = yourText
yourLabel.addInterlineSpacing(spacingValue: 1.5)
Aleksandra Nikolenko
źródło
To oczywiście zadziała tylko wtedy, gdy używasz, UILabel.texta nieUILabel.attributedText
Jeroen
9

Możesz użyć tego rozszerzenia wielokrotnego użytku:

extension String {

func lineSpaced(_ spacing: CGFloat) -> NSAttributedString {
    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineSpacing = spacing
    let attributedString = NSAttributedString(string: self, attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle])
    return attributedString
}
}
Hossam Ghareeb
źródło
5

Swift 4 i Swift 5

extension NSAttributedString {
    func withLineSpacing(_ spacing: CGFloat) -> NSAttributedString {


        let attributedString = NSMutableAttributedString(attributedString: self)
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineBreakMode = .byTruncatingTail
        paragraphStyle.lineSpacing = spacing
        attributedString.addAttribute(.paragraphStyle,
                                      value: paragraphStyle,
                                      range: NSRange(location: 0, length: string.count))
        return NSAttributedString(attributedString: attributedString)
    }
}

Jak używać

    let example = NSAttributedString(string: "This is Line 1 \nLine 2 \nLine 3 ").withLineSpacing(15)
    testLabel.attributedText = example

Przykład

Rashid Latif
źródło
Niesamowite! Zaoszczędziłem mój czas!
Codetard
4

Odpowiedź Dipena zaktualizowana dla Swift 4

let attr = NSMutableAttributedString(string: today)
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 2
attr.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSMakeRange(0, attr.length))
label.attributedText = attr;
Mike Carpenter
źródło
1
//Swift 4:
    func set(text:String,
                         inLabel:UILabel,
                         withLineSpacing:CGFloat,
                         alignment:NSTextAlignment){
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.lineSpacing = withLineSpacing
            let attrString = NSMutableAttributedString(string: text)
            attrString.addAttribute(NSAttributedStringKey.paragraphStyle,
                                    value:paragraphStyle,
                                    range:NSMakeRange(0, attrString.length))
            inLabel.attributedText = attrString
            inLabel.textAlignment = alignment
          }
Venu Gopal Tewari
źródło