您的位置:首页 > 其它

CAlayer学习

2016-03-18 14:27 465 查看
今天开始学习Quartz
Core框架,这个框架其实就是 Core Animation 

1. 每个UI控件都有对应的一个Layer,不过这个自带的layer并不会执行隐式动画,只有自己创建的calayer对象才会执行隐式动画

1)UI控件的Layer

下面是对此说法的验证

- (void)viewDidLoad {
self.view.layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"search1"].CGImage);
[self performSelector:@selector(changeLayer) withObject:self afterDelay:3];
}
- (void)changeLayer
{
self.view.layer.contents = (__bridge id )[UIImage imageNamed:@"search2"].CGImage;
self.view.layer.position = CGPointMake(200, 200);
}

设置了viewcontroller的自带View的图片,并在3秒以后执行changerLayer方法,改变图片,和位置。

画面是直接变化,没有动画效果

2)自己创建的Layer

@property (nonatomic,strong)CALayer *normalLayer;
- (void)viewDidLoad {
[super viewDidLoad];

_normalLayer = [CALayer layer];
_normalLayer.frame = self.view.frame;
_normalLayer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"search1"].CGImage);

[self performSelector:@selector(changeLayer) withObject:self afterDelay:3];

[self.view.layer addSublayer:_normalLayer];

}

- (void)changeLayer
{
_normalLayer.frame = CGRectMake(20, 20, 300, 300);
_normalLayer.contents = (__bridge id)([UIImage imageNamed:@"search2"].CGImage);
}

思路相同,自定义一个Layer,添加到View的Layer中,3秒后改变layer的frame和图片,可以看到动画效果

2.创建baseAnimation(基本动画)、AnimationGroup(组合动画)

通过设置不同的属性,执行多种动画,并将动画添加到AnimationGroup,再将calayer的动画设置成组合动画

- (void)viewDidLoad {
[super viewDidLoad];

_normalLayer = [CALayer layer];
_normalLayer.frame = self.view.frame;
_normalLayer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"search1"].CGImage);

[self performSelector:@selector(changeLayer) withObject:self afterDelay:1];
[self.view.layer addSublayer:_normalLayer];
}
- (void)changeLayer
{
CABasicAnimation *baseAnimation1 = [CABasicAnimation animationWithKeyPath:@"contents"];
baseAnimation1.fromValue = _normalLayer.contents;
baseAnimation1.toValue = (__bridge id _Nullable)([UIImage imageNamed:@"search2"].CGImage);
baseAnimation1.duration = 10;

CABasicAnimation *baseAnimation2 = [CABasicAnimation animationWithKeyPath:@"frame"];
baseAnimation1.fromValue = [NSValue valueWithCGRect:_normalLayer.frame];
baseAnimation1.toValue = [NSValue valueWithCGRect:CGRectMake(20, 20, 300, 300)];
baseAnimation1.duration = 10;

CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
animationGroup.animations = @[baseAnimation1 , baseAnimation2];
animationGroup.duration = 10;

[_normalLayer addAnimation:animationGroup forKey:nil];
}

这样就能实现自定义动画效果,但执行完动画以后,layer又会回到动画开始的样子,想要执行动画以后的效果,要在最后添加动画执行完后的参数
_normalLayer.frame = CGRectMake(20, 20, 300, 300);
_normalLayer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"search2"].CGImage);

想要了解更多CALayer,可以参考下面文档

CALayer--苹果官方文档
Layer层的属性

iOS开发系列--让你的应用“动”起来
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息