我一直在尝试使用以下方法旋转按钮:
-(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){
}
];
谢谢!
答案 0 :(得分:6)
导入“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"];
答案 1 :(得分:1)
尝试使用CGAffineTransformRotate
代替CGAffineTransformMakeRotation
。您可以使用`CGAffineTransformIdentity1作为所有调用中的第一个参数,因此根据第二个参数的最终转换将应用于框架的原始形状(?)。
答案 2 :(得分:1)
虽然它没有完美地回答这个问题,但是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 {
}
答案 3 :(得分:0)
嗯,docs说:“......指定的动画会立即在另一个线程上启动......”。现在,所有UIKit代码都不是线程安全的。因此,如果从完成块(在单独的线程中运行)调用UI setter(setTransform,setCenter)来使用performSelectorOnMainThread:withObject:
调用它们,可能会有所帮助。