在阅读了一些关于动画的教程后,我正在测试一些东西。我创建了一个带有故事板的单一视图ARC项目。我在主视图中添加了一个UIImageView,中心位于(200,200)。我正确设置了插座。
我的想法是将图像动画(UIImageView * bug)移动到左侧,然后向右旋转180°,向右移动,向左旋转180°,依此类推。
这是我的代码
viewcontroller.h
@interface ViewController : UIViewController
@property (nonatomic, assign) IBOutlet UIImageView *bug;
@end
viewcontroller.m
#import "ViewController.h"
#import <CoreGraphics/CoreGraphics.h>
@interface ViewController ()
@end
@implementation ViewController
@synthesize bug;
#pragma mark - Animations
- (void)moveToLeft
{
[UIView animateWithDuration:1.0
delay:0.0
options:UIViewAnimationCurveEaseInOut
animations:^{
NSLog(@"Animation 1");
bug.center = CGPointMake(100, 200);
}
completion:^(BOOL finished){
[self turnToRight];
}
];
}
-(void)turnToRight
{
[UIView animateWithDuration:1.0
delay:0.0
options:UIViewAnimationCurveEaseInOut
animations:^{
NSLog(@"Animation 2");
bug.transform = CGAffineTransformMakeRotation(M_PI); }
completion:^(BOOL finished){
[self moveToRight];
}
];
}
- (void)moveToRight
{
[UIView animateWithDuration:1.0
delay:0.0
options:UIViewAnimationCurveEaseInOut
animations:^{
NSLog(@"Animation 3");
bug.center = CGPointMake(200, 200);
}
completion:^(BOOL finished){
[self turnToLeft];
}
];
}
-(void)turnToLeft
{
[UIView animateWithDuration:1.0
delay:0.0
options:UIViewAnimationCurveEaseInOut
animations:^{
NSLog(@"Animation 4");
bug.transform = CGAffineTransformMakeRotation(0.0);
}
completion:^(BOOL finished){
[self moveToLeft];
}
];
}
在第二次调用CGAffineTransformMakeRotation之前,一切正常。图像向左移动,向右旋转,向右移动,然后问题!动画中断并且bug移动到第一个CGAffineTransformMakeRotation的位置,然后向左旋转,并重复步骤。
我尝试了不同的方法,但似乎每次调用CGAffineTransform时都不会考虑UIImageView的新位置,并且总是在它调用的第一个位置执行转换。我已经检查了很多例子,代码似乎是正确的,我只是不明白为什么将CGAffineTransformMakeRotation与常规动画混合会导致这种行为。
答案 0 :(得分:0)
您应该使用UIViewAnimation
Option
CurveEaseInOut
而不是UIViewAnimationCurveEaseInOut
。它们来自不同的枚举,在使用块动画时,请始终使用名称中包含 Option
的动画。
您指定的值为UIViewAnimationOptionLayoutSubviews
,这可能会导致重定位。
这是我在您的代码中发现的唯一问题。如果这不是解决方案,那么你发现了一个错误:)