旋转UIButton

我一直在尝试使用以下方法旋转按钮:

-(IBAction)rotate:(id)sender{ CGPoint pencilCenter = pencil.center; [pencil setCenter:pencilCenter]; CGFloat floater = 1.0; [UIView animateWithDuration:0.7 animations:^(void){ [pencil setTransform:CGAffineTransformMakeRotation(floater)]; }]; [UIView animateWithDuration:0.7 animations:^(void){ [pencil setTransform:CGAffineTransformMakeRotation(floater)]; }]; } 

这应该使按钮做某种“摇动”,然后它应该回到原来的位置 – 但它所做的只是改变按钮的位置,将它移动到只有一侧,并且在另一个方法的运行中按钮根本没有反应。

我的代码有什么问题?

谢谢!

编辑2:我的问题是 – 我如何制作一个按钮来做一些摇摆/摆动,例如编辑sptingboard时的摆动应用模式。

使用此代码可以让我向左旋转,从左到右,然后从右到左平滑动画,然后旋转到原始位置。 现在,我希望这不仅仅是旋转,而是通过动画来实现,就像摆动一样。

 [UIView animateWithDuration:0.25 delay:0.0 options:(UIViewAnimationOptionAllowUserInteraction | UIViewAnimationCurveLinear | UIViewAnimationOptionAutoreverse) animations:^ { pencil.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(30)); pencil.transform = CGAffineTransformIdentity; } completion:^(BOOL finished){ } ]; 

谢谢!

导入“QuartzCore / QuartzCore.h”并尝试这个,

 CABasicAnimation *fullRotation; fullRotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; fullRotation.delegate = self; fullRotation.fromValue = [NSNumber numberWithFloat:0]; fullRotation.toValue = [NSNumber numberWithFloat:((360*M_PI)/180)]; fullRotation.duration = 1.7; fullRotation.repeatCount = 2; [btnTemp.layer addAnimation:fullRotation forKey:@"360"]; 

尝试使用CGAffineTransformRotate而不是CGAffineTransformMakeRotation 。 您可以使用`CGAffineTransformIdentity1作为所有调用中的第一个参数,因此根据第二个参数的最终变换将应用于帧的原始形状(?)。

虽然它没有完美地回答这个问题,但是Shardul的答案非常适合旋转按钮(2个完整旋转)。 所以在这里,转换为Swift 3

 let fullRotation = CABasicAnimation(keyPath: "transform.rotation") fullRotation.delegate = self fullRotation.fromValue = NSNumber(floatLiteral: 0) fullRotation.toValue = NSNumber(floatLiteral: Double(CGFloat.pi * 2)) fullRotation.duration = 0.5 fullRotation.repeatCount = 2 button.layer.add(fullRotation, forKey: "360") 

您需要导入QuartzCore:

 import QuartzCore 

并且您的ViewController需要符合CAAnimationDelegate:

 class ViewController: UIViewController, CAAnimationDelegate { } 

好吧, 文档说:“……指定的动画会立即在另一个线程上启动……”。 现在,所有UIKit代码都不是线程安全的。 因此,如果从完成块(在单独的线程中运行)调用UI setter(setTransform,setCenter)来使用performSelectorOnMainThread:withObject:调用它们,可能会有所帮助。