2

我有一个图像,我想围绕一个固定点来回摆动(一次)。所以我有以下代码:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1.5];
myDial.transform = CGAffineTransformMakeRotation(degreesToRadians(45)); //lineA
[UIView commitAnimations];

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1.5];
myDial.transform = CGAffineTransformMakeRotation(degreesToRadians(0 )); //lineB
[UIView commitAnimations];

当我运行上面的代码时会发生什么是 lineA 立即执行(而不是在 1.5 秒内)。紧接着 lineB 在 1.5 秒内被执行。我希望两个动画各花费 1.5 秒。我怎样才能做到这一点

4

3 回答 3

4

与其尝试将两个 UIView 动画一起创建一个视觉动画,不如使用 Core Animation 并在一个动画中完成所有操作。使用核心动画,您可以告诉动画自动反转(在 1.5 秒内转到 45 度,然后在相同的持续时间内再次返回),您不必关心两个动画一起计时。你可以这样做:

CABasicAnimation *rotate = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
[rotate setFromValue:[NSNumber numberWithFloat:0.0]];
[rotate setToValue:[NSNumber numberWithFloat:degreesToRadians(45)]];
[rotate setDuration:1.5];
[rotate setAutoreverses:YES]; // go back the same way
[rotate setTimingFunction:[CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut]];

[[myDial layer] addAnimation:rotate forKey:@"dangleMyDial"];

如果您尚未将 QuartzCore.framework 导入您的项目并导入 ,则需要这样做才能使 Core Animation 正常工作。

于 2012-05-30T06:54:01.713 回答
2

这个想法是在完成函数中执行下一个动画序列。

我已经测试了这段代码。我冒昧地改变了一些数字,使它看起来更像一个电话拨号。

[UIView animateWithDuration: 1.0 delay: 0 options: UIViewAnimationOptionCurveLinear animations:^{
    myDial.transform = CGAffineTransformRotate(rect.transform, M_PI / 4); 
} completion:^(BOOL finished) {
    [UIView animateWithDuration: 0.7 delay: 0 options: UIViewAnimationOptionCurveEaseIn animations:^{
        myDial.transform = CGAffineTransformIdentity;
    } completion: nil];
}];
于 2012-05-30T06:05:05.947 回答
1

如果我理解你的要求正确,我想我看到了你的问题。setAnimationDuration不会延迟动画的开始;相反,它告诉动画完成多长时间。如果您实际上是在尝试延迟动画的开始,请考虑使用 aNSTimer来这样做。(或使用 setAnimationDelay 方法)。设置一个NSTimer运行第一个“旋转”,等待它完成,然后运行第二个,通过调用另一个NSTimer或使用循环。

于 2012-05-30T06:06:54.157 回答