Установить интервал между UILabel

Как изменить промежуток между строками (межстрочный интервал) в многострочном UILabel?

Ответ 1

Изменить: Очевидно, что NSAttributedString сделает это, на iOS 6 и более поздних версиях. Вместо того, чтобы использовать NSString для установки текста ярлыка, создайте NSAttributedString, установите для него атрибуты, затем установите его как .attributedText на ярлыке. Код, который вы хотите, будет примерно таким:

NSMutableAttributedString* attrString = [[NSMutableAttributedString  alloc] initWithString:@"Sample text"];
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
[style setLineSpacing:24];
[attrString addAttribute:NSParagraphStyleAttributeName
    value:style
    range:NSMakeRange(0, strLength)];
uiLabel.attributedText = attrString;

NSAttributedString old attribitedStringWithString сделал то же самое, но теперь это устарело.

По историческим причинам, здесь мой оригинальный ответ:

Короткий ответ: вы не можете. Чтобы изменить интервал между строками текста, вам придется подклассировать UILabel и перевернуть свой собственный drawTextInRect, создать несколько меток или использовать другой шрифт (возможно, отредактированный для определенной высоты строки, см. Ответ Phillipe).

Длинный ответ: В мире печати и онлайн пространство между строками текста называется "ведущим" (рифмается с "заголовком" и происходит от свинцового металла, использованного несколько десятилетий назад). Leading - это свойство только для чтения UIFont, которое устарело в 4.0 и заменено на lineHeight. Насколько я знаю, нет способа создать шрифт с определенным набором параметров, таких как lineHeight; вы получаете системные шрифты и любой пользовательский шрифт, который вы добавляете, но не можете их настроить после установки.

В UILabel нет параметра интервала.

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

Мне жаль, что в UILabel не было большей гибкости, и я был бы счастлив, если бы оказался ошибочным!

Ответ 2

Начиная с ios 6 вы можете установить атрибутную строку в UILabel:

NSString *labelText = @"some text"; 
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:labelText];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setLineSpacing:40];
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [labelText length])];
cell.label.attributedText = attributedString ;

Ответ 4

Мое решение состояло в том, чтобы исправить файл шрифта и точно определить его высоту строки. http://mbauman.net/geek/2009/03/15/minor-truetype-font-editing-on-a-mac/

Мне пришлось изменить "lineGap", "ascender", "descender" в блоке "hhea" (как в примере с блогами).

Ответ 5

Этот парень создал класс, чтобы получить высоту строки (без использования CoreText, как библиотеки MTLabel): https://github.com/LemonCake/MSLabel

Ответ 6

Лучшее, что я нашел, это: https://github.com/mattt/TTTAttributedLabel

Это подкласс UILabel, поэтому вы можете просто его вставить, а затем изменить высоту строки:

myLabel.lineHeightMultiple = 0.85;
myLabel.leading = 2;

Ответ 7

Из конструктора интерфейса:

enter image description here

Программный:

SWift 4

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

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

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

        self.attributedText = attributedString
    }
}

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

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


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

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

Ответ 8

Я нашел сторонние библиотеки, как этот:

https://github.com/Tuszy/MTLabel

Быть самым простым решением.

Ответ 9

Вот вам быстрый код для установки программных программных интервалов

let label = UILabel()

let attributedText = NSMutableAttributedString(string: "Your string")
let paragraphStyle = NSMutableParagraphStyle()

//SET THIS:
paragraphStyle.lineSpacing = 4
//OR SET THIS:
paragraphStyle.lineHeightMultiple = 4

//Or set both :)

let range = NSMakeRange(0, attributedText.length)
attributedText.addAttributes([NSParagraphStyleAttributeName : paragraphStyle], range: range)
label.attributedText = attributedText

Ответ 10

Конечно, ответ Майка не работает, если вы передаете строку программно. В этом случае вам нужно передать атрибутную строку и изменить ее стиль.

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;