Attributed String в Swift: когда обычного текста недостаточно
Вы когда-нибудь задумывались, почему в одних приложениях текст выглядит как серая скучная простыня, а в других — как произведение искусства? Секрет прост: attributed string. Это мощнейший инструмент iOS-разработчика, который позволяет управлять каждым пикселем текста: цветом, шрифтом, интервалами, тенями и даже интерактивными ссылками.
В этой статье мы разберем, как создать NSAttributedString в Swift, как его настраивать и где применять. Вы узнаете не просто сухие факты, а реальные приемы, которые сделают ваше приложение красивее и удобнее. Поехали!
Что такое Attributed String? База, которую нужно знать
В классическом String все символы одинаковы — один шрифт, один цвет, один размер. NSAttributedString (и его изменяемая версия NSMutableAttributedString) — это строка, у которой каждый символ или диапазон символов может иметь свой набор атрибутов. Представьте, что вы пишете слово «Привет»: буква «П» — красная и жирная, «р» — синяя и курсивная, и так далее. Звучит как магия? Нет, это просто Swift attributed string.
Где это используется в реальных приложениях?
- Текстовые редакторы (выделение жирным, курсивом)
- Социальные сети (упоминания @username кликабельны и выделены цветом)
- Чат-приложения (разные цвета для разных пользователей)
- Электронные книги (разные шрифты для заголовков и цитат)
- Любой интерфейс, где текст — это не просто текст, а элемент дизайна
Как создать NSAttributedString в Swift: от простого к сложному
Давайте начнем с базового примера. В Swift создание attributed string — это процесс, в котором вы определяете словарь атрибутов и применяете его к тексту.
Пример 1: Простейший attributed string
import UIKit
let plainText = "Hello, Swift!"
let attributes: [NSAttributedString.Key: Any] = [
.foregroundColor: UIColor.red,
.font: UIFont.boldSystemFont(ofSize: 18)
]
let attributedString = NSAttributedString(string: plainText, attributes: attributes)
// Используем в UILabel
let label = UILabel()
label.attributedText = attributedString
В этом примере мы создали строку, где весь текст красного цвета, жирный шрифт 18pt. Обратите внимание на NSAttributedString.Key — это перечисление всех возможных атрибутов. Их десятки, и мы рассмотрим самые полезные.
Пример 2: Разные атрибуты для разных частей текста
А вот где начинается настоящее веселье. Используем NSMutableAttributedString:
let mutableString = NSMutableAttributedString(string: "Это жирный, а это красный текст")
// Применяем жирный шрифт к первым 10 символам
mutableString.addAttribute(.font, value: UIFont.boldSystemFont(ofSize: 16), range: NSRange(location: 0, length: 10))
// Применяем красный цвет к последним 15 символам
mutableString.addAttribute(.foregroundColor, value: UIColor.red, range: NSRange(location: 14, length: 15))
// Используем в UITextView
let textView = UITextView()
textView.attributedText = mutableString
Важно: NSRange работает с позициями символов, а не с индексами Swift. Будьте внимательны, особенно с эмодзи и многобайтовыми символами.
Топ-10 атрибутов, которые вы будете использовать каждый день
Вот список ключей, которые вы будете использовать чаще всего при работе с NSAttributedString Swift:
.font— шрифт (UIFont).foregroundColor— цвет текста.backgroundColor— фон текста.underlineStyle— подчеркивание (NSUnderlineStyle).strikethroughStyle— зачеркивание.paragraphStyle— межстрочный интервал, выравнивание, отступы.kern— межсимвольное расстояние (кернинг).shadow— тень текста.link— кликабельная ссылка (URL).baselineOffset— смещение текста по вертикали (для индексов)
Пример с параграф-стилем и тенью
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 8.0
paragraphStyle.alignment = .center
let shadow = NSShadow()
shadow.shadowColor = UIColor.gray
shadow.shadowOffset = CGSize(width: 2, height: 2)
shadow.shadowBlurRadius = 4
let attributes: [NSAttributedString.Key: Any] = [
.paragraphStyle: paragraphStyle,
.shadow: shadow,
.font: UIFont(name: "HelveticaNeue-Light", size: 24) ?? UIFont.systemFont(ofSize: 24),
.foregroundColor: UIColor.darkGray
]
let fancyString = NSAttributedString(string: "Тень и стиль", attributes: attributes)
Attributed String и ссылки: делаем текст интерактивным
Одна из самых крутых фишек — превратить часть текста в кликабельную ссылку. Для этого нужно:
- Добавить атрибут
.linkк нужному диапазону - Использовать
UITextView(не UILabel), так как он поддерживает интерактивность - Включить
isSelectable = trueи обработать делегат
let text = "Посетите наш сайт PythonLib для изучения Swift"
let linkString = NSMutableAttributedString(string: text)
let range = (text as NSString).range(of: "PythonLib")
linkString.addAttribute(.link, value: "https://pythonlib.ru", range: range)
linkString.addAttribute(.foregroundColor, value: UIColor.blue, range: range)
let textView = UITextView()
textView.attributedText = linkString
textView.isSelectable = true
textView.isEditable = false
// В контроллере:
textView.delegate = self
// Реализуем:
// func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
// // Открыть URL или сделать что-то свое
// return true
// }
Работа с эмодзи и сложными символами: подводные камни
Swift и Objective-C по-разному считают длину строки. Swift использует String.Index, а NSAttributedString — NSRange. Эмодзи, флаги и другие составные символы могут занимать несколько байт, что ломает диапазоны.
Правильный подход: всегда конвертируйте Swift-диапазоны в NSRange:
let swiftString = "