Установка межстрочного интервала UILabel
Как я могу изменить разрыв между линиями (межстрочный интервал) в многострочном UILabel
?
10 ответов:
Edit: очевидно
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 старый attributedStringWithString сделал то же самое, но теперь это осуждается.
по историческим причинам, вот мой оригинал ответ:
короткий ответ: вы не можете. Чтобы изменить интервал между строками текста, вам придется подкласс
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 ;
мое решение состояло в том, чтобы исправить сам файл шрифта и определенно исправить его высоту строки. http://mbauman.net/geek/2009/03/15/minor-truetype-font-editing-on-a-mac/
Мне пришлось изменить 'lineGap', 'ascender', 'descender' в блоке 'hhea' (как в Примере блога).
От Interface Builder:
программно:
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
этот парень создал класс для получения высоты строки (без использования 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
самым простым решением.
вот некоторые swift-код для вас, чтобы установить межстрочный интервал программно
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;