简介
1.CALayer一般作为UIView的容器而使用;
2.CALayer是一个管理着图片载体(image-based content)的层结构;
3.直接修改单独创建出的CALayer的属性可以触发隐式动画;
4.UIView中的CALayer动画必须要显示触发才能生效;
实现
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong)CALayer * imageLayer;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIImage * image1 = [UIImage imageNamed:@"1"];
self.imageLayer = [CALayer layer];
self.imageLayer.frame = CGRectMake(0, 0, 320, 568);
[self.view.layer addSublayer:self.imageLayer];
self.imageLayer.contents = (__bridge id _Nullable)((image1.CGImage));
[self performSelector:@selector(layerAnimation) withObject:nil afterDelay:3.f];
}
- (void)layerAnimation {
UIImage * image2 = [UIImage imageNamed:@"2"];
/*
//第一种效果
//隐式动画
self.imageLayer.contents = (__bridge id _Nullable)((image2.CGImage));
*/
/*
//第二种效果
//显示动画,有个渐变的效果
CABasicAnimation * contentsAnimation = [CABasicAnimation animationWithKeyPath:@"contents"];
contentsAnimation.fromValue = self.imageLayer.contents;
contentsAnimation.toValue = (__bridge id _Nullable)((image2.CGImage));
contentsAnimation.duration = 3.0;
self.imageLayer.contents = (__bridge id _Nullable)((image2.CGImage));
[self.imageLayer addAnimation:contentsAnimation forKey:nil];
*/
//第三种效果
//组合动画的实现
CABasicAnimation * contentsAnimation = [CABasicAnimation animationWithKeyPath:@"contents"];
contentsAnimation.fromValue = self.imageLayer.contents;
contentsAnimation.toValue = (__bridge id _Nullable)((image2.CGImage));
contentsAnimation.duration = 3.0;
self.imageLayer.contents = (__bridge id _Nullable)((image2.CGImage));
[self.imageLayer addAnimation:contentsAnimation forKey:nil];
//bounds动画
CABasicAnimation * boundsAnimation = [CABasicAnimation animationWithKeyPath:@"bounds"];
boundsAnimation.fromValue = [NSValue valueWithCGRect:self.imageLayer.bounds];
boundsAnimation.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 320 /2, 568/2)];
//组合动画
CAAnimationGroup * groupAnimation = [CAAnimationGroup animation];
groupAnimation.animations = @[contentsAnimation,boundsAnimation];
groupAnimation.duration = 3.0;
//设定layer动画结束之后的值(必须设定,否则会恢复到动画之前的状态)
self.imageLayer.contents = (__bridge id _Nullable)((image2.CGImage));
self.imageLayer.bounds = CGRectMake(0, 0, 320 / 2, 568 / 2);
//提交动画
[self.imageLayer addAnimation:groupAnimation forKey:nil];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end