Слогер Создать блог
Разработка

Как анимировать текст в SwiftUI: разбор TextRenderer

TextRenderer даёт доступ к строкам, фрагментам и глифам. Разбираем, как с его помощью сделать анимацию текста, которая не выглядит как стандартный fade.

TextRenderer в SwiftUI — протокол, который позволяет рисовать текст вручную: получать строки, фрагменты и отдельные глифы и применять к ним трансформации. Это не просто смена шрифта, а доступ к внутренней структуре текста.

Зачем это нужно

Обычные анимации в SwiftUI работают с текстом как с единым блоком: можно изменить прозрачность, масштаб, цвет. TextRenderer позволяет зайти глубже — анимировать появление по буквам, выделять отдельные слова, добавлять эффекты на уровне глифов. На конференции SwiftLeeds 2026 Eli Perkins из Particle показал, как с помощью TextRenderer сделать текст живым: например, каждая буква появляется со сдвигом и затуханием.

Как устроен TextRenderer

Чтобы использовать рендерер, добавьте к Text модификатор .textRenderer и передайте в него экземпляр структуры, которая соответствует протоколу TextRenderer. Минимальная реализация выглядит так: в методе draw(layout:in:) вы получаете layout, перебираете строки и рисуете каждую в контекст.

struct Passthrough: TextRenderer { func draw(layout: Text.Layout, in context: inout GraphicsContext) { for line in layout { context.draw(line) } } }

SwiftUI разбивает текст на строки, строки — на фрагменты (runs), а фрагменты — на глифы. Фрагмент — это кусок строки с одинаковым стилем: жирное слово, встроенная иконка. Глиф — отдельная буква, пробел или знак препинания. К любому уровню можно применить операции: прозрачность, цвет, трансформации, группировку.

Анимация по глифам

Каждый TextRenderer также соответствует протоколу Animatable. Если добавить свойство animatableData и анимировать его, можно управлять отрисовкой. В примере с конференции рендерер AppearRenderer получает progress от 0 до 1. Внутри draw он собирает все глифы в плоский массив, вычисляет для каждого момент начала и рисует копию контекста с нужной прозрачностью и сдвигом вверх.

Ключевая формула: let start = Double(index) / count * 0.7; let amount = min(max((progress - start) / 0.3, 0), 1). Здесь 0.7 — доля общего прогресса, за которую глифы успевают начать появляться, а 0.3 — длина анимации одного глифа. Меняя эти числа, можно получить волну или каскад.

Готовые рендереры есть в коллекции Prismic от Paul Hudson. С неё проще начать: можно посмотреть, как устроены разные эффекты, и адаптировать под свой проект.

Когда использовать, а когда нет

TextRenderer хорошо подходит для акцентных заголовков и онбординга. Анимация по буквам привлекает внимание и делает интерфейс запоминающимся. Но не стоит анимировать каждый текстовый блок на экране: это отвлекает и может замедлить восприятие. Для обычного появления текста хватит стандартных модификаторов.

Сравнение подходов:

КритерийСтандартные модификаторыTextRenderer
Уровень контроляВесь текст целикомСтроки, фрагменты, глифы
Анимация по буквамСложно или невозможноВстроена через Animatable
КодМинимумНужен свой рендерер
СценарииПоявление блока, смена цветаЭффекты набора, акцентные заголовки

Типичные ошибки

  • Анимировать большие объёмы текста. По глифам — красиво, но на длинных абзацах это утомляет и может нагружать CPU/GPU.
  • Использовать TextRenderer без необходимости. Если эффект не несёт смысла, он лишний.

На той же конференции Antoine van der Lee поднял вопрос, не теряем ли мы любовь к Swift, когда пишем меньше кода руками. TextRenderer — как раз пример того, где ручной контроль даёт ощутимый результат: вы разбираетесь, как устроен текст изнутри, вместо вызова готового модификатора. И это возвращает интерес к ремеслу.

Попробуйте начать с Passthrough, затем добавьте animatableData и простую прогрессивную анимацию. Дальше можно экспериментировать с цветом и группировкой глифов. Главное — не превращать эффект в самоцель.

По материалам: career. Текст переработан редакцией Слогера.

← На главную

Рекламное место — Конец поста
Реклама · Слогер

Комментарии (0)

Войдите, чтобы комментировать.

Пока нет комментариев. Будьте первым.

Разработка

New Box Skin APK: что это на самом деле и как проверить файл перед установкой на Android

За названием с номером версии 1.59 не стоит ни разработчика, ни отзывов, ни внятного описания. Разбираем, как отличить каталог скинов от опасного APK и что проверить до установки.

Слогер 18.10.2026 ▲ 0
AI

Как не-разработчику вести AI-пилоты на работе: пять шагов, четыре условия и точка остановки

Сотрудник небольшого калифорнийского суда довёл до результата два AI-прототипа, оба закрыл своими руками и трижды выступил с рассказом об этом. Полезное здесь — не про модели, а про письменные разрешения, обезличенные данные и умение остановиться.

Слогер 18.10.2026 ▲ 0
Маркетинг

Как продавать технические услуги крупным заказчикам: плейбук от первого звонка до второго контракта

В энтерпрайзе никто не покупает демо — покупают обещание, что ваши люди придут и доведут до результата. Разбираю процесс, который делает это обещание правдоподобным.

Слогер 18.10.2026 ▲ 0
Fluxs lenta
Реклама · fluxs.ru
Стартапы

Как превратить диссертацию в бизнес: разбор пути от научной работы до двух компаний

Одна диссертация про заикание и виртуальную реальность, MBA, две компании в США и Индии и продукт на стыке науки и рынка. Разбираем последовательность шагов и то, что из неё можно взять себе.

Слогер 16.10.2026 ▲ 0
Fluxs lenta
Реклама · fluxs.ru
Карьера

Почему в удалённых вакансиях не пишут зарплату и как всё-таки понять вилку

Открытая вилка OpenAI в 198 000–320 000 долларов в год — редкость: деньги называет лишь каждая пятая удалённая вакансия. Разбираем, как читать такие цифры и что делать, когда компенсацию скрыли.

Слогер 16.10.2026 ▲ 0
Разработка

Почему чистый код не продаёт продукт: пять привычек вместо рефакторинга

Аккуратная архитектура и зелёные тесты не приводят покупателей. Разбираем, почему разработчики прячутся в редакторе и в каком порядке делать продукт, чтобы он кому-то понадобился.

Слогер 15.10.2026 ▲ 0
Fluxs lenta
Реклама · fluxs.ru