我有一个想要在固定点附近来回摇摆(一次)的图像。所以我有以下代码:
[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秒内)。就在该行之后,在1.5秒内执行。我希望两个动画每个都需要1.5秒。我怎么能这样做
答案 0 :(得分:4)
您可以只使用Core Animation并在一个动画中完成所有操作,而不是尝试将两个UIView动画组合在一起来创建一个可视动画。使用核心动画,您可以告诉动画自动反转(在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正常工作。
答案 1 :(得分: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];
}];
答案 2 :(得分:1)
如果我理解你的要求是正确的,我想我会看到你的问题。 setAnimationDuration
不会延迟动画的开始;相反,它告诉动画要完成多长时间。如果您实际上是在尝试延迟动画的开始,请考虑使用NSTimer
来执行此操作。 (或使用setAnimationDelay方法)。设置运行第一个“旋转”的NSTimer
,等待它完成,然后通过调用另一个NSTimer
或使用循环来运行第二个。