Какой у вас опыт работы с Core Animation?

Ответ

Работал с Core Animation для создания производительных и сложных анимаций, которые невозможно или неэффективно реализовать через UIView.animate.

Ключевые технологии и задачи:

  • CALayer: Работа с базовыми слоями, CAShapeLayer для анимации векторных путей, CAGradientLayer.
  • Анимации: CABasicAnimation, CAKeyframeAnimation (включая анимацию по пути path), CAAnimationGroup.
  • Транзакции и тайминг: CATransaction, настройка timingFunction (CAMediaTimingFunction).
  • Переходы: CATransition для кастомных переходов между слоями.

Пример: Анимация движения и изменения цвета с помощью CAKeyframeAnimation.

let positionAnimation = CAKeyframeAnimation(keyPath: "position")
positionAnimation.path = UIBezierPath(ovalIn: bounds).cgPath
positionAnimation.duration = 2.0
positionAnimation.repeatCount = .infinity

let colorAnimation = CABasicAnimation(keyPath: "backgroundColor")
colorAnimation.fromValue = UIColor.red.cgColor
colorAnimation.toValue = UIColor.blue.cgColor
colorAnimation.duration = 2.0
colorAnimation.autoreverses = true
colorAnimation.repeatCount = .infinity

let layer = CALayer()
layer.add(positionAnimation, forKey: "move")
layer.add(colorAnimation, forKey: "colorChange")
view.layer.addSublayer(layer)

Преимущества Core Animation: Высокая производительность (анимации выполняются на GPU), точный контроль над каждым кадром и возможность анимации не-аннимируемых свойств UIView.

Ответ 18+ 🔞

Эх, ну ты глянь, какой серьёзный текст, аж скулы свело. Давай-ка я его так, по-человечьи, перескажу, а то читать — терпения ноль, ебать.

В общем, бывало такое, что стандартные анимации через UIView.animate — это как пытаться на велосипеде через болото проехать. Вроде и крутишь педали, а нихуя не едет, только брызги летят. Вот тут-то и выходит на сцену Core Animation, этакий тяжёлый артиллерист в мире iOS.

Что там у нас в арсенале было, блядь:

  • CALayer: Это типа фундамент, кирпичики, из которых всё собрано. А если нужна не просто квадратная морда, а что-то фигурное, то CAShapeLayer — твой лучший друг, чтобы пути векторные анимировать. Ну и CAGradientLayer, чтобы градиентами красиво размазать.
  • Сами анимации: CABasicAnimation — это как молоток, простой и понятный. CAKeyframeAnimation — уже целый швейцарский нож, можно по сложному маршруту (path) объект гонять. А если надо всё и сразу, то CAAnimationGroup в помощь, чтоб не плодить сущности.
  • Тайминг и прочая магия: CATransaction — чтоб несколько изменений в одну кучу собрать, а timingFunction (CAMediaTimingFunction) — чтобы не просто тупо из точки А в точку Б, а с ускорением, замедлением, пружинкой, в общем, красиво.
  • Переходы: CATransition — когда надо не просто моргнуть, а сделать вычурный переход между слоями, с кубиками, скольжениями и прочей хуйнёй.

Вот, смотри, живой пример. Делаем шарик, который по кругу бегает и цвет меняет, как хамелеон под кислотой.

// Анимация движения по пути (кругу)
let positionAnimation = CAKeyframeAnimation(keyPath: "position")
positionAnimation.path = UIBezierPath(ovalIn: bounds).cgPath // Вот он, наш круглый маршрут
positionAnimation.duration = 2.0
positionAnimation.repeatCount = .infinity // Бегай, сука, вечно!

// Анимация смены цвета фона
let colorAnimation = CABasicAnimation(keyPath: "backgroundColor")
colorAnimation.fromValue = UIColor.red.cgColor
colorAnimation.toValue = UIColor.blue.cgColor
colorAnimation.duration = 2.0
colorAnimation.autoreverses = true // Чтоб туда-сюда, не просто один раз
colorAnimation.repeatCount = .infinity

// Создаём слой-шарик и навешиваем на него обе анимации
let layer = CALayer()
layer.add(positionAnimation, forKey: "move") // Ключ — просто имя, чтоб потом найти можно было
layer.add(colorAnimation, forKey: "colorChange")
view.layer.addSublayer(layer) // И втыкаем это чудо на вьюху

И в чём же, блядь, кайф? А кайф в том, что вся эта движуха идёт напрямую на видеокарту (GPU), а не грузит центральный процессор. Получается овердохуища плавно и можно анимировать вообще любую хуйню, даже то, что UIView анимировать отказывается наотрез. В общем, мощный инструмент, но и возни с ним, конечно, побольше.