Ada*_*ach 12 iphone core-animation cakeyframeanimation
对于完全适合动画组方法的动画效果,如Brad Larson的答案所示,我需要动画根据输入继续进行.具体地说是检测到的触摸的触摸和位置.它很容易处理touchesMoved:并为每次触摸设置元素的位置,但它不像核心动画方法那样平滑.
想象一下在沟槽轨道上的大理石.我想把大理石沿着一个方向或另一个方向以任何速度推到任何位置.动画必须做类似的事情,沿着路径移动视觉元素以响应触摸.CAKeyframeAnimation具有完全相同的路径位,但似乎总是希望基于时间过去的帧到帧的过渡,而不是基于任何其他因素,并且在一个方向上.
1月31日更新 - 感谢所有回复到目前为止,但没有一个真正解决问题.我有一个圆形菜单被拖动以选择一个选项.所有这些都需要一起移动,我通过使用一个应用了旋转变换的视图并将逆旋转变换应用于其子视图来解决它,因此图标都以适当的摩天轮方向旋转.当图标沿着略微卵形的路径动画时,它看起来确实更好......大理石描述试图弄清楚我正在尝试做什么.更好的想法可能是想象磁铁可以排斥所有在凹槽中移动的东西 - 移动一个并且它的邻居也可以移动但不一定在拖动的磁铁随着路径弯曲的方向移动.
现在问题是跟随用一个圆创建的简单路径之一,但我真的想知道如何沿任意路径动画对象,仅通过触摸控制位置而不涉及速度或方向的计算.
您可以使用层树中时间轴的分层特性来实现您正在寻找的内容.实现的对象CAMediaTiming
,包括CAAnimation
和CALayer
,继承父节点的时空,他们可以修改(通过缩放,移位和重复)并传播给他们的子节点.通过将speed
图层的属性设置为0.0并timeOffset
手动调整属性,可以将该图层(及其所有子图层)与通常的时间概念分离.
在您的情况下,您要做的是定义所有菜单项的动画,以便CGPath
在时间t 0到t 1期间沿着您想要的位置设置动画,并timeOffset
在每个动画上使用适当的动画来保持项目间隔适当.请注意,beginTime
动画中的0.0通常被解释为从动画添加到其图层开始,因此如果您希望t 0为0.0,则可能必须将其设置为小于0.0的微小epsil.
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
animation.beginTime = 1e-100;
animation.duration = 1.0;
animation.fillMode = kCAFillModeBoth;
animation.removedOnCompletion = NO;
animation.path = path;
animation.calculationMode = kCAAnimationPaced;
animation.timeOffset = timeOffset;
Run Code Online (Sandbox Code Playgroud)
然后,您speed
可以在父图层(仅包含这些菜单项)上将属性设置为0.0,并将其更新timeOffset
为t 0和t 1之间的值,以响应您的触摸事件.
这种方法有两个潜在的警告.因为您已经在这个图层子树上接管了时间的本质,所以您可能无法同时为其他属性设置动画.此外,如果您想要快速轻弹的滑行行为,您可能需要自己动画时间.