Встановіть інтервал між рядками 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, і я би радий, що я виявив себе неправильним!


1
Я робив це з підкласифікацією UILabel, в основному ідея полягає в тому, щоб розділити текст мітки на лексеми, а потім ідентичність довжини кожного маркера, створити окрему мітку для кожного маркера та додати одну за іншою. Це воно.
Матриця

3
Брехня! ;) Ви можете закріпити файл шрифту, щоб змінити висоту рядка - дивіться мою відповідь на цій сторінці.
Філіпп

Мене припускають вважати, що існує спосіб зробити це за допомогою 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 ;

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

Швидкий 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

Потрібно пройти лише одну лінію аргументаціїРозміщення або кратневисота, не можна передати обидві аргументи інших мудреців, результат не прийде, я думаю
Arpit B Парех

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
Я не можу повірити, що це найкраще рішення (без образи!), Але воно, безумовно, найпростіше. Для редагування моїх шрифтів я використовував безкоштовне програмне забезпечення Type Light (і під шрифтом | Metrics | Advanced ви можете змінювати lineGap). Це також дозволяє "перейменовувати" шрифти, що я не міг зрозуміти, як це зробити за допомогою згаданого інструменту Philippe.
Кірк Волл

Це фантастично @Philippe! Дякую за пост !!
Роббі

Також дивіться моя відповідь на аналогічне питання для більш специфічних: stackoverflow.com/a/19553827/201828
phatmann

@iamjustaprogrammer Знову в мережі.
Метт Б.




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

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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.