实现跟踪触摸的平滑可逆动画的最佳方法是什么?我指的是其中的动画,例如,如果用户执行滑动手势,则某些元素在屏幕上平滑地进行动画处理,而其他元素关闭,但如果用户相反来回缓慢地拖动平移手势,则相同的对象将移动根据触摸位置以百分比表示的前进/后退。在许多应用介绍和过渡中都可以看到这一点。我已经发现
我不了解-而且我对使用CAAnimations和手势很满意-是如何使动画和交互。
通常,当我创建动画时,我会提交动画,并且动画从头到尾都是如此。虽然我可以在继续触摸时中断动画,但看起来好像会停滞不前。
另一方面,响应用户输入来移动事物很容易,但这并不是动画。
如何实现效果,即某些动画可以根据动画进行更改,但又可以使完全相同的动画与触摸相关联,并且仍然具有动画效果,因此,即使动画达到完成效果,它也不会真正“完成”(变成不可逆的) ),除非用户释放触摸,否则在交互过程中的任何时候(如果用户释放平移),动画将根据最后的触摸位置和速度返回到其起始位置或动画化为完成。这些要求令人困惑。
我看到的该技术的所有内容都涉及关键帧动画,但我不了解的是触摸事件与动画相交的位置,以创建我看到的这些平滑效果。
任何提示,示例或教程都是最欢迎的。
最佳答案
这是因为设置了动画后,您可以将该动画设置为所需的任何“帧”。因此,您可以跟踪与手势移动相对应的动画。
它的工作方式是动画是渲染树的一个功能,属于CALayer。 CALayer实现CAMediaTiming协议(protocol)。因此,CALayer的timeOffset
确定该图层显示的动画的“帧”。如果复杂的动画涉及许多不同的层,那就没问题了。只需设置其相互上层的timeOffset
,即可控制整个动画的帧。
实际上,这正是新的iOS 7交互式自定义过渡功能的工作方式(您在问题中正确提到的功能)。例如,在此示例代码中:
https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/iOS7bookExamples/bk2ch06p296customAnimation2/ch19p620customAnimation1/AppDelegate.m
...我一直在更新UIPercentDrivenInteractiveTransition,以告诉它用户的手势有多远,因此动画会跟踪手势。现在问问自己:这怎么可能???
好吧,UIPercentDrivenInteractiveTransition又在幕后,不断调整图层的timeOffset
以在相应的帧处描绘动画。 (您实际上可以将日志记录代码添加到我的示例中,以查看这是正确的。)
此外,当我在一个不完整的点上结束手势时,动画要么匆忙结束,要么倒退到其开始-同样,这是因为CAMediaTiming协议(protocol)使您可以更改动画的speed
(包括负值)向后运行。