Avatar ·

Как управлять межстрочным интервалом в UILabel (Swift)

Всем привет! Я новичок в iOS разработке на Swift, и у меня возникла проблема с UILabel. Мне нужно, чтобы текст в метке отображался с увеличенным расстоянием между строками — примерно как в CSS свойство line-height. По умолчанию UILabel использует стандартный межстрочный интервал, который выглядит слишком сжатым для моего дизайна. Я пробовал использовать атрибуты шрифта, но ничего не выходит. Вот мой текущий код: ```swift let label = UILabel() label.text = "Это длинный текст, который должен отображаться в несколько строк. Мне нужно, чтобы между строками было больше пространства." label.numberOfLines = 0 label.font = UIFont.systemFont(ofSize: 16) label.textAlignment = .left ``` Я читал, что можно использовать NSAttributedString с NSMutableParagraphStyle, но когда я это делаю, текст вообще не отображается или остаётся без изменений. Может быть, я что-то упускаю? Пожалуйста, подскажите, как правильно настроить межстрочный интервал в UILabel на Swift. Нужно ли использовать storyboard или только код? И как сделать так, чтобы работало для многострочного текста? Заранее спасибо! <<>>

Решение: Использование NSAttributedString и NSMutableParagraphStyle

Да, вы на правильном пути — для управления межстрочным интервалом в UILabel нужно использовать NSAttributedString с настройкой NSMutableParagraphStyle. Стандартный UILabel.text не поддерживает прямое управление межстрочным интервалом, поэтому мы работаем через атрибутированную строку.

Вот правильный рабочий код:

// Создаём UILabel
let label = UILabel()
label.numberOfLines = 0
label.font = UIFont.systemFont(ofSize: 16)
label.textAlignment = .left

// Текст для отображения
let text = "Это длинный текст, который должен отображаться в несколько строк. Мне нужно, чтобы между строками было больше пространства."

// Создаём NSMutableParagraphStyle
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 8.0 // Межстрочный интервал в пунктах (points)

// Дополнительно можно настроить другие параметры:
// paragraphStyle.lineHeightMultiple = 1.5 // Множитель высоты строки
// paragraphStyle.minimumLineHeight = 20   // Минимальная высота строки
// paragraphStyle.maximumLineHeight = 30   // Максимальная высота строки

// Создаём атрибутированную строку
let attributedString = NSAttributedString(
    string: text,
    attributes: [
        .paragraphStyle: paragraphStyle,
        .font: UIFont.systemFont(ofSize: 16)
    ]
)

// Присваиваем label
label.attributedText = attributedString

Подробное объяснение

  • NSMutableParagraphStyle — объект, который хранит параметры форматирования абзаца: межстрочный интервал (lineSpacing), выравнивание, отступы и т.д.
  • Ключ .paragraphStyle — передаётся в словарь атрибутов NSAttributedString. Без него настройки не применятся.
  • lineSpacing — расстояние в пунктах (points) между базовыми линиями строк. Значение 8–10 pt даёт комфортный интервал для текста размером 16 pt.
  • numberOfLines = 0 — обязательно, иначе текст будет в одну строку.

Вариант для Storyboard / Interface Builder

Если вы используете Storyboard, создайте IBOutlet для label и настройте атрибутированный текст в коде (например, в viewDidLoad). В самом Interface Builder нет прямых настроек межстрочного интервала, поэтому код обязателен.

Дополнительные советы

  • Если вы используете Auto Layout, убедитесь, что label имеет ограничения по ширине — иначе текст не будет переноситься.
  • Для динамического изменения интервала обновляйте attributedText заново, например, при повороте экрана или смене шрифта.
  • Проверяйте, что text не nil — иначе атрибуты не применятся, и label останется пустым.

Расширение (extension) для удобства

extension UILabel {
    func setLineSpacing(lineSpacing: CGFloat) {
        guard let text = self.text else { return }
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = lineSpacing
        let attributedString = NSAttributedString(
            string: text,
            attributes: [
                .paragraphStyle: paragraphStyle,
                .font: self.font ?? UIFont.systemFont(ofSize: 16)
            ]
        )
        self.attributedText = attributedString
    }
}

// Использование:
label.setLineSpacing(lineSpacing: 10.0)

Теперь ваш label будет отображать текст с увеличенным межстрочным интервалом. Экспериментируйте со значением lineSpacing — для большинства шрифтов размера 14–18 pt оптимальный интервал 6–12 pt.

<<>>

Альтернативный подход: Использование UILabel и фреймворка TextKit

Если вам нужен более тонкий контроль над межстрочным интервалом, можно работать напрямую с NSLayoutManager и NSTextContainer. Это даёт возможность управлять не только lineSpacing, но и другими параметрами, такими как межсимвольный интервал (kern) или базовая линия.

Пример:

let text = "Пример текста с кастомным интервалом."
let attributedString = NSMutableAttributedString(string: text)

// Устанавливаем межстрочный интервал через NSMutableParagraphStyle
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 12.0
attributedString.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: text.count))

// Дополнительно можно задать межсимвольный интервал
attributedString.addAttribute(.kern, value: 1.5, range: NSRange(location: 0, length: text.count))

label.attributedText = attributedString

Этот метод полезен, если вы хотите комбинировать несколько атрибутов (например, разные цвета или шрифты для разных частей текста) вместе с межстрочным интервалом. Однако для простого увеличения расстояния между строками достаточно первого решения с NSMutableParagraphStyle.

Обратите внимание: NSAttributedString работает как с UILabel, так и с UITextView и UITextField, поэтому вы можете использовать этот же код для других элементов интерфейса.