Особенности анимации 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(то есть easein/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.
Спасибо за полезную информацию!