暂停和继续动画的核心代码如下:
//暂停layer上面的动画 - (void)pauseLayer:(CALayer*)layer { CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil]; layer.speed = 0.0; layer.timeOffset = pausedTime; } //继续layer上面的动画 - (void)resumeLayer:(CALayer*)layer { CFTimeInterval pausedTime = [layer timeOffset]; layer.speed = 1.0; layer.timeOffset = 0.0; layer.beginTime = 0.0; CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime; layer.beginTime = timeSincePause; }
附上完整代码
AnimationPauseViewController.h
#import <UIKit/UIKit.h> @interface AnimationPauseViewController : UIViewController { UIImageView *soccer; BOOL isPause; UIButton *controlButton; } @property (nonatomic, retain) IBOutlet UIImageView *soccer; - (IBAction)clickControlButton:(id)sender; @property (nonatomic, retain) IBOutlet UIButton *controlButton; @end
AnimationPauseViewController.m
#import "AnimationPauseViewController.h" #import <QuartzCore/QuartzCore.h> @implementation AnimationPauseViewController @synthesize controlButton; @synthesize soccer; - (void)dealloc { [soccer release]; [controlButton release]; [super dealloc]; } - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } - (void)addAnimations { //让足球来回移动 CABasicAnimation *translation = [CABasicAnimation animationWithKeyPath:@"position"]; translation.fromValue = [NSValue valueWithCGPoint:CGPointMake(24, 240)]; translation.toValue = [NSValue valueWithCGPoint:CGPointMake(320- 24, 240)]; translation.duration = 2; translation.repeatCount = HUGE_VALF; translation.autoreverses = YES; //让足球来回转动 CABasicAnimation *rotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; //kCAMediaTimingFunctionLinear 表示时间方法为线性,使得足球匀速转动 rotation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; rotation.toValue = [NSNumber numberWithFloat:4 * M_PI]; rotation.duration = 2; rotation.repeatCount = HUGE_VALF; rotation.autoreverses = YES; [soccer.layer addAnimation:rotation forKey:@"rotation"]; [soccer.layer addAnimation:translation forKey:@"translation"]; } #pragma mark - View lifecycle - (void)viewDidLoad { [super viewDidLoad]; [self addAnimations]; } - (void)viewDidUnload { [self setSoccer:nil]; [self setControlButton:nil]; [super viewDidUnload]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait); } //暂停layer上面的动画 - (void)pauseLayer:(CALayer*)layer { CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil]; layer.speed = 0.0; layer.timeOffset = pausedTime; } //继续layer上面的动画 - (void)resumeLayer:(CALayer*)layer { CFTimeInterval pausedTime = [layer timeOffset]; layer.speed = 1.0; layer.timeOffset = 0.0; layer.beginTime = 0.0; CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime; layer.beginTime = timeSincePause; } - (void)pauseSoccer { isPause = YES; [controlButton setTitle:@"继续" forState:UIControlStateNormal]; [self pauseLayer:soccer.layer]; } - (void)resumeSoccer { isPause = NO; [controlButton setTitle:@"暂停" forState:UIControlStateNormal]; [self resumeLayer:soccer.layer]; } - (IBAction)clickControlButton:(id)sender { if (isPause) { [self resumeSoccer]; }else{ [self pauseSoccer]; } } @end