Какие сложные UI-задачи вы решали в UIKit?

«Какие сложные UI-задачи вы решали в UIKit?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

1. Кастомный анимированный таймер с интерактивным управлением

  • Задача: Создать визуализацию таймера с плавной анимацией прогресса и возможностью изменения времени жестом.
  • Решение: Использовал CAShapeLayer для отрисовки кругового трека и прогресса. Анимация strokeEnd через CABasicAnimation с CAMediaTimingFunction для плавности. Для интерактивности добавил UIPanGestureRecognizer, который пересчитывает время на основе смещения.
  • Пример кода анимации:
    let progressLayer = CAShapeLayer()
    let animation = CABasicAnimation(keyPath: "strokeEnd")
    animation.duration = 10.0
    animation.fromValue = 0
    animation.toValue = 1
    animation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
    progressLayer.add(animation, forKey: "progressAnimation")

2. Сложная таблица с sticky-заголовками секций, меняющими стиль

  • Задача: Реализовать таблицу с заголовками секций, которые прилипают к верху и динамически меняют внешний вид при скролле.
  • Решение: Комбинация UITableView с кастомным UICollectionView в качестве header. Синхронизация скролла через KVO наблюдение за contentOffset. Изменение стиля заголовка (например, фона или шрифта) вычислялось на основе позиции скролла.

3. Онбординг с параллакс-эффектом и прерываемыми анимациями

  • Задача: Создать плавный анимированный онбординг, где переходы между экранами можно прервать свайпом.
  • Решение: Использовал UIViewPropertyAnimator для управления интерактивными переходами. Параллакс достигался за счет применения разных CGAffineTransform к слоям фона и переднего плана. Ключевой момент — корректная пауза, отмена или завершение анимации при прерывании пользователем.