Особенности анимации UIView

На уровне UIView можно анимировать три основных параметра:

  • frame
  • transform (перемещение, поворот и масштабирование)
  • alpha (прозрачность)

Анимация UIView выполняется методом animationWithDuration:

someView.alpha = 1.0
UIView.animationWithDuration(2.0, delay: 0.0,options: UIViewAnimationOptions.CurveEaseOut,
animations:​{ someView.alpha = 0.0 }
completion:​{ if $0 { someView.removeFromSuperView() } }​)
print(“someView.alpha = \(someView.alpha)”)

Аргументами метода выступают два значения времени в секундах — первое сколько длится анимация, второе через сколько начать анимацию (в данном примере длительность 2 сек, начинаем без задержек), а также два замыкания. В замыкании animations мы устанавливаем параметры которые хотим изменить (тут начальное значение задано в первой строке
someView.alpha = 1.0, а конечное значение someView.alpha = 0.0 уже в замыкании). В замыкании completion — происходит проверка на завершенность анимации. Она может быть не завершена, если в течение двух секунд, которые длится анимация, что-то (например другая анимация) попыталось изменить свойство alpha  у someView. В этом случае анимация считается незавершенной и параметр $0 будет  false и соответственно не выполнится удаление someView из иерархии superview

Пятая строка напечатает someView.alpha = 0.0. Очень важно понимать, что изменения свойств происходят сразу же, незамедлительно, хотя анимация и длится в течение некоторого времени. Анимация просто показывает изменение, растянутое во времени, хотя на самом деле уже все изменения произошли.

//
// proSwift.ru
//

UIViewAnimationOptions
BeginFromCurrentState​​// прерывает другие действующие анимации этого свойства
AllowUserInteraction​ ​// разрешает обработку жестов во время анимации
LayoutSubviews​​// анимирует новое размещение subviews наряду с анимацией родителя
Repeat​ ​// повторяет бесконечно
Autoreverse​ ​// проигрывает анимацию вперед, затем ­ назад
OverrideInheritedDuration​​// если не установлен, то использует duration ​любой активной анимации
OverrideInheritedCurve​​// если не установлен, то использует curve​(то есть ease­in/out) любой активной анимации
AllowAnimatedContent​​// если не установлен, то интерполирует между текущими и конечными “битами”
CurveEaseInEaseOut​​// медленно вначале, нормально повсюду, медленно в конце
CurveEaseIn​ ​// медленно вначале, затем постоянная скорость на остатке пути
CurveLinear​ ​// одна и та же скорость повсюду

Только BeginFromCurrentState, если будет запущена во время выполнения другой анимации, возьмет то значение параметра, которое в данный момент на экране.

Когда нужно сделать полное изменение view мы не ограничены такими специфическими свойствами, как alpha​, frame​ и  transform. Методом  класса UIView.transitionWithView: мы можем:

UIViewAnimationOptionsTransitionFlipFrom{Left,Right,Top,Buttom}
// целиком перевернуть полный view
UIViewAnimationOptionsTransitionCurl{Up, Down}
// Завернуть вверх или вниз
UIViewAnimationOptionsTransitionCrossDissolve
// “Растворить” старый view ​в новом

Т.е.

UIView.transitionWithView(view: UIView,
                         duration: NSTimerInterval,
                         options: UIViewAnimationOptions,
                         animations:​() ­> Void
                         completion: ((finished: Bool) ­> Void)? )

в замыкании animations мы запускам методы перерисовки UIView

И наконец анимация изменений в иерархии UIView. Если нужно анимировать удаление/добавление/скрытие/появление subviews то нужно использовать еще один метод класса UIView:

UIView.transitionWithView(fromView: UIView,
                         toView: UIView,
                         options: UIViewAnimationOptions,
                         completion: ((finished: Bool) ­> Void)? )

Тут нет замыкания анимации, потому что изменения коснутся только иерархии views. UIViewAnimationOptionsTransitionCrossDissolve​если вы хотите использовать свойство hidden. В противном случае он действительно убирает fromView ​из иерархии views​ и добавляет toView​.

Метки: , , ,
Один комментарий на “Особенности анимации UIView
  1. Алекс:

    Спасибо за полезную информацию!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.