← Назад к вопросам

Какие знаешь способы анимации UIView?

1.6 Junior🔥 192 комментариев
#UIKit и верстка#Анимации и графика

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

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Основные способы анимации UIView в iOS

В iOS существует несколько мощных и гибких способов анимации объектов UIView, каждый из которых подходит для разных сценариев. Основные подходы можно разделить на три категории: блочные анимации, анимации с помощью Property Animator и анимации Core Animation.

1. Блочные анимации (UIView Animation)

Это классический и исторически первый способ, предоставляющий простой API для анимации изменений свойств вью.

Анимация с замыканием (Closure-based):

UIView.animate(withDuration: 0.5, animations: {
    view.alpha = 0.0
    view.center = CGPoint(x: 100, y: 100)
})

Анимация с completion-блоком:

UIView.animate(withDuration: 0.5, animations: {
    view.frame = CGRect(x: 50, y: 50, width: 100, height: 100)
}, completion: { finished in
    if finished {
        print("Анимация завершена")
    }
})

Анимация с параметрами:

UIView.animate(withDuration: 0.5,
               delay: 0.2,
               options: [.curveEaseInOut, .autoreverse],
               animations: {
    view.transform = CGAffineTransform(scaleX: 1.5, y: 1.5)
}, completion: nil)

Пружинная анимация:

UIView.animate(withDuration: 0.5,
               delay: 0,
               usingSpringWithDamping: 0.7,
               initialSpringVelocity: 0.5,
               options: [],
               animations: {
    view.center.y += 100
}, completion: nil)

2. UIViewPropertyAnimator

Более современный и гибкий API, представленный в iOS 10, который позволяет интерактивно контролировать анимации.

Базовое использование:

let animator = UIViewPropertyAnimator(duration: 0.5, curve: .easeInOut) {
    view.backgroundColor = .blue
    view.alpha = 0.5
}
animator.startAnimation()

Интерактивное управление:

let animator = UIViewPropertyAnimator(duration: 1.0, curve: .linear) {
    view.frame.origin.x += 200
}

// Добавляем обработчики
animator.addCompletion { position in
    print("Анимация завершена в позиции: \(position)")
}

// Запускаем и можем паузить/возобновлять
animator.startAnimation()
animator.pauseAnimation()

// Изменяем прогресс анимации
animator.fractionComplete = 0.3

Кастомные тайминг-функции:

let timing = UICubicTimingParameters(controlPoint1: CGPoint(x: 0.17, y: 0.17),
                                     controlPoint2: CGPoint(x: 0.83, y: 0.83))
let animator = UIViewPropertyAnimator(duration: 1.0, timingParameters: timing)

3. Core Animation (CALayer анимации)

Более низкоуровневый подход, работающий непосредственно с слоями (CALayer), который предоставляет максимальную гибкость.

Базовые анимации:

let animation = CABasicAnimation(keyPath: "opacity")
animation.fromValue = 1.0
animation.toValue = 0.0
animation.duration = 0.5
view.layer.add(animation, forKey: "fadeAnimation")

Keyframe анимации:

let animation = CAKeyframeAnimation(keyPath: "position")
animation.values = [
    view.layer.position,
    CGPoint(x: view.layer.position.x + 50, y: view.layer.position.y),
    CGPoint(x: view.layer.position.x + 50, y: view.layer.position.y + 50),
    view.layer.position
]
animation.duration = 1.0
animation.calculationMode = .cubicPaced
view.layer.add(animation, forKey: "positionAnimation")

Групповые анимации:

let scaleAnimation = CABasicAnimation(keyPath: "transform.scale")
scaleAnimation.toValue = 1.5

let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation")
rotateAnimation.toValue = CGFloat.pi * 2

let group = CAAnimationGroup()
group.animations = [scaleAnimation, rotateAnimation]
group.duration = 0.5
view.layer.add(group, forKey: "groupAnimation")

Ключевые различия и рекомендации по выбору:

Когда использовать UIView Animation:

  • Простые анимации изменения frame, alpha, transform
  • Требуется минимальное количество кода
  • Совместимость с более старыми версиями iOS

Когда использовать UIViewPropertyAnimator:

  • Нужно интерактивное управление анимацией
  • Требуется возможность паузы, возобновления, реверсирования
  • Сложные тайминг-функции и кастомные кривые
  • iOS 10 и выше

Когда использовать Core Animation:

  • Сложные анимации с кастомными свойствами
  • Анимации по нестандартным путям (bezier paths)
  • Необходимость точного контроля над временем и скоростью
  • Анимации, которые должны работать в фоновом потоке

Важные аспекты для профессионального использования:

  1. Производительность: Для сложных анимаций предпочтительнее использовать transform вместо прямого изменения frame, так как трансформации используют аппаратное ускорение.

  2. Потокобезопасность: Все UIView анимации должны выполняться на главном потоке.

  3. Retain Cycles: Внимание к циклам удержания при захвате self в completion-блоках.

  4. Отмена анимаций: Для отмены существуют методы layer.removeAllAnimations() или более контролируемые подходы через UIViewPropertyAnimator.stopAnimation(_:).

  5. Состояние после анимации: При использовании Core Animation нужно явно устанавливать финальные значения свойств, так как анимации по умолчанию возвращаются в исходное состояние.

Каждый из этих методов имеет свои сильные стороны, и опытный iOS-разработчик должен уметь выбирать оптимальный подход в зависимости от конкретной задачи, требований к производительности и нужного уровня контроля над анимацией.

Какие знаешь способы анимации UIView? | PrepBro