Как изменить расстояние между строками (межстрочный интервал) в мультилинии UILabel?
Ответы:
Изменить: очевидно, это 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, и я был бы счастлив, если бы ошибся!
Начиная с 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 ;
AttributedStringотключает, например, выравнивание текста метки, поэтому вам нужно добавить его в стиль абзаца.
Из Интерфейсного Разработчика:

Программно:
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
Мое решение заключалось в том, чтобы исправить сам файл шрифта и определенно исправить его высоту строки. http://mbauman.net/geek/2009/03/15/minor-truetype-font-editing-on-a-mac/
Мне пришлось изменить 'lineGap', 'ascender', 'descender' в блоке 'hhea' (как в примере блога).
Этот парень создал класс для получения высоты строки (без использования CoreText в качестве библиотеки MTLabel): https://github.com/LemonCake/MSLabel
Лучшее, что я нашел: https://github.com/mattt/TTTAttributedLabel
Это подкласс UILabel, поэтому вы можете просто вставить его, а затем изменить высоту строки:
myLabel.lineHeightMultiple = 0.85;
myLabel.leading = 2;
Я нашел сторонние библиотеки, подобные этой:
https://github.com/Tuszy/MTLabel
Быть самым простым решением.
Вот какой-то быстрый код для программной установки межстрочного интервала
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
Конечно, ответ Майка не сработает, если вы передадите строку программно. В этом случае вам нужно передать атрибутивную строку и изменить ее стиль.
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;