Установить межстрочный интервал UILabel

Ответы:

122

Изменить: очевидно, это 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;

Старый attributedStringWithString NSAttributedString в сделал то же самое, но теперь , что является устаревшим.

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

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

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

Также нет параметра интервала UILabel.

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

Я бы хотел, чтобы здесь было больше гибкости UILabel, и я был бы счастлив, если бы ошибся!

AndrewS
источник
1
Я сделал это с подклассом UILabel, в основном идея состоит в том, чтобы разделить текст метки на токены, а затем определить длину каждого токена, создать отдельную метку для каждого токена и добавить один за другим. Это оно.
Matrix
3
Вранье! ;) Вы можете пропатчить файл шрифта, чтобы изменить высоту строки - см. Мой ответ на этой странице.
Philippe
Я считаю, что есть способ сделать это с помощью NSAttributedString. Если вам нужны ярлыки с атрибутированными строками в версиях до iOS 6, ознакомьтесь с OHAttributedLabel .
Спенсер Уильямс
Сделайте это с помощью NSAttributesString, если вы используете iOS> = 6. Пример
d.ennis
Это просто и прекрасно работает.
Р. Мохан
75

Начиная с 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 ;
iosMentalist
источник
1
Спасибо! Я бы добавил, что использование AttributedStringотключает, например, выравнивание текста метки, поэтому вам нужно добавить его в стиль абзаца.
cyborg86pl
56

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

повторяющийся вопрос

Майк С
источник
10
Однако в Xcode 6.1.1 выбор метки и изменение значения строки на панели с атрибутами приведет к мерцанию панели и блокировке приложения. Мне удалось выйти из панели только принудительным выходом из Xcode.
izk
4
Спасибо за анимацию
Tieme
1
В версии 7.1 панель щелкает, и это не влияет на время выполнения. Пришлось делать это в коде.
MiguelSlv
440 ватт электричества только что прошло через мою панель;)
Сарасрангт
23

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

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

Программно:

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
Крунал
источник
Нужно передать только одну строку аргументаSpacing или multipleLineheight, нельзя передать оба аргумента, иначе, думаю, никакого результата не будет
Arpit B Parekh
16

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

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

Филипп
источник
Очень круто! Эти инструменты шрифтов OS X также работали с моим шрифтом OTF (хотя он указывает только TTF ...). У моего шрифта высота строки 1000 (!), Я изменил его на 0 и вуаля. У меня были мили и мили пустого места под текстом в каждой строке.
Джонни
2
Не могу поверить, что это лучшее решение (без обид!), Но это, безусловно, самое простое. Я использовал бесплатное программное обеспечение (Windows) Type Light (и в разделе Font | Metrics | Advanced вы можете изменить lineGap) для редактирования своих шрифтов. Он также позволяет «переименовывать» шрифты, что я не мог понять, используя инструмент, упомянутый Филиппом.
Кирк Уолл
Это потрясающе, @Philippe! Спасибо за пост !!
Робби
Также см. Мой ответ на аналогичный вопрос для более подробной информации: stackoverflow.com/a/19553827/201828
phatmann
@iamjustaprogrammer Он снова в сети.
Мэтт Б.
8

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

адриенденат
источник
7

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

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

myLabel.lineHeightMultiple = 0.85;
myLabel.leading = 2;
lms
источник
4

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

https://github.com/Tuszy/MTLabel

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

Дерек Бреденштайнер
источник
MSLabel лучше
триллионы
2

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

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
Ullstrm
источник
0

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

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;
Рикардо Мутти
источник