Attributed String в Swift: полный гайд с примерами кода

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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 и ссылки: делаем текст интерактивным

Одна из самых крутых фишек — превратить часть текста в кликабельную ссылку. Для этого нужно:

  1. Добавить атрибут .link к нужному диапазону
  2. Использовать UITextView (не UILabel), так как он поддерживает интерактивность
  3. Включить 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 = "                

Блоги

Рекомендаций по книгам