Я анимирую вид между двумя точками, используя UIViewAnimationCurveLinear, поэтому я знаю скорость этой анимации. В определенных обстоятельствах я хочу добавить UIViewAnimationCurveEaseOut, чтобы замедлить просмотр. Чтобы сделать этот эффект плавным, анимация замедления должна начинаться с той же скоростью, что и предшествовавшая ей линейная анимация. Учитывая фиксированное расстояние, на котором я хочу, чтобы это смягчение происходило, как я могу вычислить продолжительность, необходимую для достижения этой известной начальной скорости?
Например, предположим, что я анимирую свое представление от x = 0 до x = 100 за 10 секунд. Таким образом, скорость составляет 10 пикселей в секунду. Теперь я хочу, чтобы представление замедлилось с x = 100 до x = 120 с помощью анимации UIViewAnimationCurveEaseOut. Какой продолжительности должна быть эта анимация, чтобы она начиналась с 10 пикселей в секунду?
Насколько я понимаю, функция CAMediaTimingFunction в Core Animation управляет темпом анимации с помощью кубических кривых Безье, где вторая и третья контрольные точки определяют форму кривой. Я предполагаю, что функции плавности UIViewAnimationCurve также являются кубическими кривыми Безье. Если бы я знал контрольные точки по умолчанию, используемые этими функциями, я смог бы выработать формулу для вычисления длительности с учетом скорости и расстояния, но мне не удалось нигде найти эти контрольные точки по умолчанию.
2 ответа
Возможно, я не смогу дать вам полный ответ, но я могу указать вам на метод CAMediaTimingFunction -getControlPointAtIndex:values:. Это должно позволить вам создать функцию синхронизации EaseOut, а затем изучить ее контрольные точки.
Я также укажу вам на статью Мэтта Галлахера a> о пользовательских кривых ускорения, сделанных с помощью CAKeyframeAnimation, которые также могут быть вам полезны.
Вы можете использовать константу (назовем ее BEZIER_INTEGRAL_CONSTANT
), которая аппроксимирует интеграл кривой Безье для анимации продолжительностью 1 секунду, начиная со скорости 1 пиксель в секунду. Для линейного смягчения эта константа равна 0.5
. Для UIViewAnimationCurveEaseOut
это приблизительно 0.7
. Формула длительности такова:
duration = distance / (velocity * BEZIER_INTEGRAL_CONSTANT)
Для вашего примера, где расстояние составляет 20 пикселей, а начальная скорость — 10 пикселей в секунду, продолжительность должна быть примерно: 20 / (10 * 0.7) = 2.9 seconds
.
Похожие вопросы
Новые вопросы
iphone
НЕ ИСПОЛЬЗУЙТЕ этот тег, если вы не обращаетесь конкретно к iPhone и / или iPod touch от Apple. Для вопросов, не зависящих от оборудования, используйте тег [ios]. Больше тегов, которые нужно рассмотреть, это [xcode] (но только если вопрос касается самой IDE), [swift], [target-c] или [cocoa-touch] (но не [cocoa]). Пожалуйста, воздержитесь от вопросов, касающихся iTunes App Store или iTunes Connect. Если вы используете C #, пометьте [mono].