目标c:CGAffineTransformMakeRotation

时间:2012-05-30 06:03:07

标签: objective-c animation core-animation rotation cgaffinetransform

我有一个想要在固定点附近来回摇摆(一次)的图像。所以我有以下代码:

[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秒。我怎么能这样做

3 个答案:

答案 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或使用循环来运行第二个。