3

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

-(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){
                 }
 ];

谢谢!

4

4 回答 4

7

导入“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"];
于 2013-04-27T12:53:05.283 回答
1

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

于 2013-04-25T18:23:53.830 回答
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 {

}
于 2017-07-01T14:47:31.267 回答
0

好吧,文档说:“......指定的动画立即在另一个线程上启动......”。现在,所有 UIKit 代码都不是线程安全的。因此,如果改为从完成块(在单独的线程中运行)调用您的 UI 设置器(setTransform,setCenter)以使用performSelectorOnMainThread:withObject:.

于 2013-04-25T19:44:45.040 回答