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 (на которую вы справедливо ссылаетесь в своем вопросе). Например, в этом примере кода:

https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/iOS7bookExamples/bk2ch06p296customAnimation2/ch19p620customAnimation1/AppDelegate.m

... Я продолжаю обновлять UIPercentDrivenInteractiveTransition, чтобы сообщить ему, как далеко проходит жест пользователь, и поэтому анимация отслеживает жест. Теперь спросите себя: как, черт возьми, это возможно???

Ну, а UIPercentDrivenInteractiveTransition, в свою очередь, скрытно продолжает регулировать слой timeOffset изобразить анимацию в соответствующем кадре. (Вы можете добавить код регистрации в мой пример, чтобы убедиться, что это правда.)

Более того, когда я заканчиваю жест в неполной точке, анимация либо спешит до конца, либо возвращается назад к ее началу - опять же, это из-за протокола CAMediaTiming, который позволяет вам изменить speed анимации, включая отрицательное значение для запуска назад.

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