基于输入值(触摸)而不是时间的iPhone动画

如Brad Bradley的答案所示,对于动画效果完全适合动画组的方法,我需要根据输入进行动画。 具体触摸和检测触摸的位置。 处理touchesMoved很容易:并且为每个触摸设置元素的位置,但它不像核心动画方法那样平滑。

想像一条凹槽轨道上的大理石。 我想把大理石沿任何一个方向或任何方向推到任何位置。 动画必须做类似的事情,将视觉元素沿着路径移动以响应触摸。 CAKeyframeAnimation具有精确的路径位,但似乎总是希望基于帧到帧的过渡,而不是任何其他因素,并且在一个方向上。

1月31日更新 - 感谢所有迄今为止的回应,但没有人真正解决问题。 我有一个圆形菜单被拖动来选择一个选项。 所有这些都需要一起移动,并且我通过使用应用了旋转变换的视图并将逆旋转变换应用于其子视图,以便图标都以适当的摩天轮方向旋转来解决此问题。 当图标沿着略微卵形的路径动画时,它确实看起来更好......大理石描述试图表明我正在尝试做什么。 或许想象一下,想象磁铁能排斥所有在凹槽中行进的磁铁 - 移动一个磁铁并且它的邻居也移动,但不一定是被拖动的磁铁随着路径弯曲而移动的方向。

现在问题是一个简单的路径创建一个圆圈,但我真的想知道如何沿着任意路径设置物体的动画,纯粹通过触摸来控制位置,而不涉及速度或方向的计算。


您可能能够在层次树中使用时间轴的分层特性来实现您要查找的内容。 实现包含CAAnimationCALayer CAMediaTiming对象从它们的父代继承一个时间空间,他们可以修改它们(通过缩放,移动和重复)并传播给他们的孩子。 通过将图层的speed属性设置为0.0并手动调整timeOffset属性,可以将该图层(及其所有子图层)与通常的时间概念分离。

在你的情况下,你会做的是定义所有菜单项的动画,从时间t0到t1,沿着你想要的CGPath动画他们的位置,在每个动画上使用适当的timeOffset来保持你的项目适当的间隔。 请注意,动画中的beginTime为0.0通常被解释为从动画添加到其图层开始,因此如果您希望t0为0.0,则可能必须将其设置为小于0.0的小epsilon。

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;

然后,您将在父图层(仅包含这些菜单项)上将speed属性设置为0.0,并将其timeOffset更新为t0和t1之间的值以响应您的触摸事件。

这种方法有两个潜在的警告。 因为您已经接管了此图层子树上的时间性质,所以您可能无法同时为其他属性制作动画。 另外,如果你想快速滑动滑行行为,你可能需要自己动起来。


如果您的目标是iOS 4.0或更高版本,那么您可以使用新的基于块的类方法来启动对视图对象的动画更改。 因此,从触摸事件中,您可以启动对视图属性的动画更改:

[UIView animateWithDuration:1.0 animations:^{
    yourView.alpha = 0.0; // fade out yourView over 1 second
}];

NB这可能很容易改变视图上的其他属性,如其位置。 您可以通过这种方式在视图上为以下属性设置动画效果:

@property frame
@property bounds
@property center
@property transform
@property alpha
@property backgroundColor
@property contentStretch

如果您要定位iOS的早期版本,则需要使用UIView beginAnimations和commitAnimations方法来创建动画块:

[UIView beginAnimations:nil context:context];
[UIView setAnimationDuration:1.0]; 
yourView.alpha = 0.0;
[UIView commitAnimations];

这些东西运行得很好,一旦你开始使用它,你将不得不小心,不要上瘾。 ;)

更新评论:

您可以将大理石的位置绑定到触摸事件的位置。 一旦获得touchesEnded事件,您就可以使用动画块为大理石的位置设置动画。


速度=距离/时间。 您可以根据移动的触摸和时间进行延迟尝试。 您可以计算touchesBegan和touchesEnded方法之间的时间。

链接地址: http://www.djcxy.com/p/39483.html

上一篇: iPhone animation based on input values (touches) not time

下一篇: Core Data + Core Animation/CALayer together?