如何在ios中运用core animation暂停和继续动画

暂停和继续动画的核心代码如下:
//暂停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


你可能感兴趣的:(ios,animation,interface,layer,translation)