CAkeyframeAnimation:提供了关键帧动画的支持。你可以为层属性指定key path来使其产生动画,这个数组的值保存了动画每个阶段的值,同时还有key frame的次数和时间函数。在动画运行的时候,数组中的每个值就会被轮流进行插值使用。
- (
void)viewDidLoad {
[super viewDidLoad];
self.title = [[self class] displayName];
self.view.backgroundColor = [UIColor blackColor];
CGFloat radius = 30.0f;
CGFloat diameter = radius * 2;
CGPoint arcCenter = CGPointMake(radius, radius);
// Create a UIBezierPath for Pacman's open state
pacmanOpenPath = [[UIBezierPath bezierPathWithArcCenter:arcCenter
radius:radius
startAngle:DEGREES_TO_RADIANS( 35)
endAngle:DEGREES_TO_RADIANS( 315)
clockwise:YES] retain];
[pacmanOpenPath addLineToPoint:arcCenter];
[pacmanOpenPath closePath];
// Create a UIBezierPath for Pacman's close state
pacmanClosedPath = [[UIBezierPath bezierPathWithArcCenter:arcCenter
radius:radius
startAngle:DEGREES_TO_RADIANS( 1)
endAngle:DEGREES_TO_RADIANS( 359)
clockwise:YES] retain];
[pacmanClosedPath addLineToPoint:arcCenter];
[pacmanClosedPath closePath];
// Create a CAShapeLayer for Pacman, fill with yellow
shapeLayer = [CAShapeLayer layer];
shapeLayer.fillColor = [UIColor yellowColor].CGColor;
shapeLayer.path = pacmanClosedPath.CGPath;
shapeLayer.strokeColor = [UIColor grayColor].CGColor;
shapeLayer.lineWidth = 1.0f;
shapeLayer.bounds = CGRectMake( 0, 0, diameter, diameter);
shapeLayer.position = CGPointMake(- 40, - 100);
[self.view.layer addSublayer:shapeLayer];
SEL startSelector = @selector(startAnimation);
UIGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:startSelector];
[self.view addGestureRecognizer:recognizer];
[recognizer release];
// start animation after short delay
[self performSelector:startSelector withObject:nil afterDelay: 1.0];
}
- ( void)startAnimation {
// Create CHOMP CHOMP animation
CABasicAnimation *chompAnimation = [CABasicAnimation animationWithKeyPath: @" path "];
chompAnimation.duration = 0.25;
chompAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
chompAnimation.repeatCount = HUGE_VALF;
chompAnimation.autoreverses = YES;
// Animate between the two path values
chompAnimation.fromValue = ( id)pacmanClosedPath.CGPath;
chompAnimation.toValue = ( id)pacmanOpenPath.CGPath;
[shapeLayer addAnimation:chompAnimation forKey: @" chompAnimation "];
// Create digital '2'-shaped path
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(- 40, 100)];
[path addLineToPoint:CGPointMake( 360, 100)];
[path addLineToPoint:CGPointMake( 360, 200)];
[path addLineToPoint:CGPointMake(- 40, 200)];
[path addLineToPoint:CGPointMake(- 40, 300)];
[path addLineToPoint:CGPointMake( 360, 300)];
CAKeyframeAnimation *moveAnimation = [CAKeyframeAnimation animationWithKeyPath: @" position "];
moveAnimation.path = path.CGPath;
moveAnimation.duration = 8.0f;
// Setting the rotation mode ensures Pacman's mouth is always forward. This is a very convenient CA feature.
moveAnimation.rotationMode = kCAAnimationRotateAuto;
[shapeLayer addAnimation:moveAnimation forKey: @" moveAnimation "];
[super viewDidLoad];
self.title = [[self class] displayName];
self.view.backgroundColor = [UIColor blackColor];
CGFloat radius = 30.0f;
CGFloat diameter = radius * 2;
CGPoint arcCenter = CGPointMake(radius, radius);
// Create a UIBezierPath for Pacman's open state
pacmanOpenPath = [[UIBezierPath bezierPathWithArcCenter:arcCenter
radius:radius
startAngle:DEGREES_TO_RADIANS( 35)
endAngle:DEGREES_TO_RADIANS( 315)
clockwise:YES] retain];
[pacmanOpenPath addLineToPoint:arcCenter];
[pacmanOpenPath closePath];
// Create a UIBezierPath for Pacman's close state
pacmanClosedPath = [[UIBezierPath bezierPathWithArcCenter:arcCenter
radius:radius
startAngle:DEGREES_TO_RADIANS( 1)
endAngle:DEGREES_TO_RADIANS( 359)
clockwise:YES] retain];
[pacmanClosedPath addLineToPoint:arcCenter];
[pacmanClosedPath closePath];
// Create a CAShapeLayer for Pacman, fill with yellow
shapeLayer = [CAShapeLayer layer];
shapeLayer.fillColor = [UIColor yellowColor].CGColor;
shapeLayer.path = pacmanClosedPath.CGPath;
shapeLayer.strokeColor = [UIColor grayColor].CGColor;
shapeLayer.lineWidth = 1.0f;
shapeLayer.bounds = CGRectMake( 0, 0, diameter, diameter);
shapeLayer.position = CGPointMake(- 40, - 100);
[self.view.layer addSublayer:shapeLayer];
SEL startSelector = @selector(startAnimation);
UIGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:startSelector];
[self.view addGestureRecognizer:recognizer];
[recognizer release];
// start animation after short delay
[self performSelector:startSelector withObject:nil afterDelay: 1.0];
}
- ( void)startAnimation {
// Create CHOMP CHOMP animation
CABasicAnimation *chompAnimation = [CABasicAnimation animationWithKeyPath: @" path "];
chompAnimation.duration = 0.25;
chompAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
chompAnimation.repeatCount = HUGE_VALF;
chompAnimation.autoreverses = YES;
// Animate between the two path values
chompAnimation.fromValue = ( id)pacmanClosedPath.CGPath;
chompAnimation.toValue = ( id)pacmanOpenPath.CGPath;
[shapeLayer addAnimation:chompAnimation forKey: @" chompAnimation "];
// Create digital '2'-shaped path
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(- 40, 100)];
[path addLineToPoint:CGPointMake( 360, 100)];
[path addLineToPoint:CGPointMake( 360, 200)];
[path addLineToPoint:CGPointMake(- 40, 200)];
[path addLineToPoint:CGPointMake(- 40, 300)];
[path addLineToPoint:CGPointMake( 360, 300)];
CAKeyframeAnimation *moveAnimation = [CAKeyframeAnimation animationWithKeyPath: @" position "];
moveAnimation.path = path.CGPath;
moveAnimation.duration = 8.0f;
// Setting the rotation mode ensures Pacman's mouth is always forward. This is a very convenient CA feature.
moveAnimation.rotationMode = kCAAnimationRotateAuto;
[shapeLayer addAnimation:moveAnimation forKey: @" moveAnimation "];
}