Миграция с `POPSpringAnimation` на нативный фреймворк iOS в Swift 4

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

Вот старый код:

POPSpringAnimation *springAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPViewFrame];
springAnimation.toValue = [NSValue valueWithCGRect:rect];
springAnimation.velocity = [NSValue valueWithCGRect:CGRectMake(springVelocity, springVelocity, 0, 0)];
springAnimation.springBounciness = springBounciness;
springAnimation.springSpeed = springSpeed;
[springAnimation setCompletionBlock:^(POPAnimation *anim, BOOL finished) {
    if (finished) {
         // cool code here
    }
}];

[self.selectedViewController.view pop_addAnimation:springAnimation forKey:@"springAnimation"];

Что я пробовал:

[UIView animateWithDuration:1.0
                      delay:0
     usingSpringWithDamping:springBounciness
      initialSpringVelocity:springVelocity
                    options:UIViewAnimationOptionCurveEaseInOut animations:^{
                        self.selectedViewController.view.frame = rect;
} completion:^(BOOL finished) {
    // cool code here
}];

Но я не получаю тот же результат, и возникает вопрос:

  1. является springBounciness в поп-эквиваленте usingSpringWithDamping?
  2. Что эквивалентно springSpeed в UIView анимация?
  3. как насчет продолжительности, какова продолжительность POPSpringAnimation?

Изменить: О третьем вопросе я нашел проблему в Github.

Если UIView разве это не путь, который можно сделать с помощью Core Animation или любого другого встроенного фреймворка iOS?

1 ответ

Решение

Значения параметра Pop варьируются от 0 до 20. Но у usingSpringWithDamping такого диапазона нет. Очевидно, что Pop - это пользовательская библиотека, у которой есть свой диапазон значений, а у анимации UIView - свой.

Из документации Apple, использование параметра SpringWithDamping на самом деле является коэффициентом демпфирования, и он определяет:

Чтобы плавно замедлить анимацию без колебаний, используйте значение 1. Используйте коэффициент демпфирования, близкий к нулю, чтобы увеличить колебания.

1. Так что если вы хотите эквивалентную bounciness, вам нужно использовать значения ниже 1, я думаю, вы можете попробовать следующую формулу для springBounciness.

float uiViewBounciness = (20.0 - springBounciness) / 20.0;
.. usingSpringWithDamping:uiViewBounciness ..

2. Что касается springVelocity, Pop реализует одинаковую скорость для всех кадров анимации, тогда как анимация UIView указывает только начальную скорость, и эта скорость уменьшается со временем на основе общей продолжительности и коэффициента затухания. Таким образом, чтобы получить максимально близкую анимацию, вы можете сделать следующее:

float uiViewSpeed = springVelocity * 2.0; 
.. initialSpringVelocity:uiViewSpeed  ..

3. Что касается длительности, вы можете реализовать то же значение для animateWithDuration в методе UIView.

Наконец, вам нужно поэкспериментировать со значениями и сравнить их с поп-анимацией. Я не думаю, что вы можете получить точно такую ​​же анимацию с помощью Pop с помощью анимации UIView, но это должно быть достаточно близко.

Другие вопросы по тегам