1

我有下一个任务:按钮单击图像必须旋转到 90 度。

我的代码是:

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
@interface ViewController : UIViewController
@property (strong, nonatomic) IBOutlet UIImageView *vector;
@end

=========

@interface ViewController ()

@end

@implementation ViewController
@synthesize vector;

- (void)viewDidLoad
{
    [super viewDidLoad];
}
- (IBAction)rotateOn:(id)sender {
    [self rotateImage:self.vector duration:2
                curve:UIViewAnimationCurveEaseIn degrees:M_PI/2];
}

- (void)rotateImage:(UIImageView *)image duration:(NSTimeInterval)duration
              curve:(int)curve degrees:(CGFloat)degrees
{
    // Setup the animation
    [UIView beginAnimations:NULL context:NULL];
    [UIView setAnimationDuration:duration];
    [UIView setAnimationCurve:curve];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [image.layer setAnchorPoint:CGPointMake(0.5,0.5)];
    CGAffineTransform transform =
    CGAffineTransformMakeRotation(degrees);
    image.transform = transform;
    [UIView commitAnimations];
}




点击按钮之前我有这个

点击前


点击之后

点击后

您可以看到该图像旋转到 90 度。但它从起始中心点向下移动。此外,如果我再次单击按钮,则不会发生任何事情。

4

4 回答 4

1

我假设您正在使用 iOS6 和情节提要,尝试在情节提要中禁用自动布局并再次测试动画。
如果它有效,并且想要保留自动布局功能,您将需要调整您的约束

顺便说一句,默认anchorPoint已经是(0.5, 0.5),该行不是必需的(除非您在anchorPoint其他地方修改):

[image.layer setAnchorPoint:CGPointMake(0.5,0.5)];
于 2013-09-14T13:18:54.943 回答
1

在你的旋转按钮方法中,使用此代码将图像旋转 90

static int numRot = 0;
myimage.transform = CGAffineTransformMakeRotation(M_PI_2 * numRot);
++numRot;
于 2015-09-30T13:25:59.507 回答
0

利用 :

imageView.transform = CGAffineTransformMakeRotation(0);//Upright
imageView.transform = CGAffineTransformMakeRotation(M_PI/2);//90 degrees clockwise
imageView.transform = CGAffineTransformMakeRotation(-M_PI/2);//90 degrees counter-clockwise

另外,检查你的框架

  • 在你点击按钮之前
  • 点击按钮后,旋转前
  • 旋转后

你可能会在那里发现异常。

于 2013-09-14T13:25:16.133 回答
0

删除这一行:

  [image.layer setAnchorPoint:CGPointMake(0.5,0.5)];

它实际上并没有做任何事情,因为 {0.5,0.5} 是默认值和中心点。您一定一直在使用不同的值(例如 {0,0})来获得偏心旋转。

要在每次单击按钮时增加旋转,您需要使用累积变换。“Make...”转换是上下文无关的——它们不考虑以前的转换。而是试试这个:

CGAffineTransform transform; 
transform = CGAffineTransformRotate(image.transform, degrees);
image.transform = transform;

然后,您将degrees旋转添加到当前图像的变换中,而不是将变换重置为新值。

于 2013-09-14T13:12:35.220 回答