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