Как увеличить межстрочный интервал в UILabel в Swift

94

У меня есть этикетка с несколькими строками текста, и я хочу увеличить расстояние между строками. Есть похожие вопросы, которые задают другие, но решения не решают моих проблем. Также мой ярлык может содержать или не содержать абзацы. Я новичок в Swift. Есть ли решение с использованием раскадровки? Или только через NSAttributedStringэто можно?

Снеха
источник

Ответы:

175

Программно добавьте LineSpacing к вашему, UILabelиспользуя следующий фрагмент.

Более ранняя версия 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
Дипен Панчасара
источник
3
Это показывает ошибку «Значение типа« NSAttributedString »не имеет члена« addAttribute »».
Sneha
2
NSMutableAttributedStringВместо этого нам нужно использовать NSAttributedString. Я обновил ответ.
Дипен Панчасара
1
Также отлично работайте с пользовательскими шрифтами @ Dipen Panchasara
Abdul Karim
7
Я не знаю почему, но, как по мне, это работает, только если вы устанавливаете междустрочный интервал> = 1, я пытался установить 0,5 / 0,75, это не имеет никакого эффекта
Aximem
2
Нет необходимости в NSMutableAttributedString. Можно использоватьNSAttributedString(string: "Your text", attributes: [NSAttributedString.Key.paragraphStyle : paragraphStyle])
bauerMusic
101

Из Интерфейсного Разработчика:

введите описание изображения здесь

Программно:

SWift 4 и 4.2

Использование расширения метки

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

Теперь вызовите функцию расширения

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

Или используя экземпляр метки (просто скопируйте и выполните этот код, чтобы увидеть результат)

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
Крунал
источник
«NSAttributedStringKey.paragraphStyle» имела ошибку, вместо этого я использовал «NSParagraphStyleAttributeName».
Ахмадреза
@Alfi - Это разница языковой версии Swift. Быстрый язык вашего проекта. версия может быть быстрой 3.x, и вот ответы для обеих версий. Попробуйте использовать код Swift 3.
Krunal
Привет @krunal, я установил Linespacing и LineHeight в интерфейсе, и я установил текст в UILabel программно, но он не работает. если я добавлю текст в интерфейс, он сработает. не могли бы вы помочь мне в этом Спасибо, и я также установил attributedText и текст в UILabel, но этот подход не работает для меня.
Йогеш Патель
Решение построителя интерфейса предназначено только для статического текста. когда мы добавляем в код атрибутивную строку, тот атрибут, который добавлен из построителя интерфейса, не применяется.
Йодагама,
66

Вы можете контролировать межстрочный интервал в storyboard.

введите описание изображения здесь

Тот же вопрос.

pkc456
источник
8
Я действительно пробовал это. Но это не работает. Также это бесполезно для пользовательских шрифтов.
Sneha
Если вы столкнулись с неправильным выравниванием пользовательских шрифтов, попробуйте обновить ascenderсвойство, как указано здесь .
pkc456
1
Это не проблема несоосности. Я не могу выбрать свой собственный шрифт с помощью решения, которое вы сказали @ pkc456
Sneha
Это не проблема несоосности. Я не мог выбрать свой собственный шрифт, но теперь я решил это, добавив свой шрифт через настройки отдельно в атрибуте. Но по-прежнему интервал остается прежним. @ Pkc456
Sneha
15
Это только для статического текста. Попробуйте добавить текст программно. Это не сработает.
Sneha
11

Недавнее решение для 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
    }

}

И использование:

let yourLabel = UILabel()
let yourText = "Hello \n world \n !"
yourLabel.text = yourText
yourLabel.addInterlineSpacing(spacingValue: 1.5)
Александр Николенко
источник
Это, конечно, будет работать, только если вы используете, UILabel.textа неUILabel.attributedText
Джерун
9

Вы можете использовать это многоразовое расширение:

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
}
}
Хоссам Гариб
источник
5

Swift 4 и 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)
    }
}

Как использовать

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

пример

Рашид Латиф
источник
Потрясающе! Сэкономил мое время!
Codetard,
4

Ответ Дипена обновлен для 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;
Майк Карпентер
источник
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
          }
Вену Гопал Тевари
источник