iOS - Как сделать анимацию трэков касаний
Каков наилучший способ реализовать плавную реверсивную анимацию, касающуюся треков? Я имею в виду те анимации, в которых, например, если пользователь выполняет жест смахивания, некоторые элементы плавно анимируются на экране, а другие отключаются, но если пользователь вместо этого медленно перетаскивает жест панорамирования назад и вперед, те же объекты будут двигаться вперед / назад в процентах в соответствии с положением касания. Это видно во многих заставках приложений, а также в переходах. я нашел
- Один учебник, в котором обсуждается встроенное средство для этого, но оно только между переходами контроллера представления, не предоставляя полный детальный контроль, который я вижу во многих приложениях ( http://www.doubleencore.com/2013/09/ios-7-custom-transitions/)
- Jazzhands, который является набором IFTTT, но это пакетное решение, которое может не охватывать, как решение лучше всего реализовать на более низком уровне ( https://github.com/IFTTT/JazzHands)
- Здесь вопрос, для которого один ответ показывает, как можно выполнить анимацию после окончания жеста ( iOS Touch, Gestures, Animation)
То, что я не понимаю - и мне удобно использовать CAAnimations и жесты - это то, как что-то может быть как анимированным, так и интерактивным.
Как правило, когда я создаю анимацию, я фиксирую анимацию, и она идет от начала до конца. В то время как я мог прервать анимацию по мере продолжения касаний, похоже, что это будет неестественно.
С другой стороны, перемещать вещи в ответ на пользовательский ввод легко, но это не анимировано.
Как достигается эффект, когда что-то может изменяться в зависимости от анимации, но при этом точно такая же анимация может быть привязана к прикосновениям, и при этом все же также иметь его, чтобы, хотя анимация достигала завершения, она действительно не "заканчивалась" (становилась необратимой), если пользователь не отпускает касание, а в любой момент во время взаимодействия, если пользователь отпускает панорамирование, анимация либо возвращается обратно в исходное положение, либо анимируется до завершения, в зависимости от местоположения и скорости последнего касания. Эти требования сбивают с толку.
Проблески этой техники, которую я вижу, включают анимации ключевых кадров, но я не понимаю, где сенсорные события пересекаются с анимацией, чтобы создать эти плавные эффекты, которые я вижу.
Любые советы, примеры или учебники приветствуются.
1 ответ
То, что я не понимаю - и мне удобно использовать CAAnimations и жесты - это то, как что-то может быть как анимированным, так и интерактивным.
Это потому, что, настроив анимацию, вы можете установить эту анимацию на любой "кадр", какой пожелаете. Таким образом, вы можете отслеживать анимацию в соответствии с движением жеста.
Это работает так, что анимация - это особенность дерева рендеринга, принадлежащего CALayer. CALayer реализует протокол CAMediaTiming. timeOffset
CALayer, таким образом, определяет, какой "кадр" анимации отображает этот слой. Если сложная анимация включает в себя много разных слоев, нет проблем; просто установите timeOffset
их взаимного суперслоя, чтобы управлять кадром всей анимации.
Это именно то, как работает новая функция интерактивного пользовательского перехода iOS 7 (на которую вы справедливо ссылаетесь в своем вопросе). Например, в этом примере кода:
... Я продолжаю обновлять UIPercentDrivenInteractiveTransition, чтобы сообщить ему, как далеко проходит жест пользователь, и поэтому анимация отслеживает жест. Теперь спросите себя: как, черт возьми, это возможно???
Ну, а UIPercentDrivenInteractiveTransition, в свою очередь, скрытно продолжает регулировать слой timeOffset
изобразить анимацию в соответствующем кадре. (Вы можете добавить код регистрации в мой пример, чтобы убедиться, что это правда.)
Более того, когда я заканчиваю жест в неполной точке, анимация либо спешит до конца, либо возвращается назад к ее началу - опять же, это из-за протокола CAMediaTiming, который позволяет вам изменить speed
анимации, включая отрицательное значение для запуска назад.