说明:
CALayer是层的概念,每个UIView有一个CALayer,可实现各种样式设置,CALayer还可单独加入某个UIiew上成为子视图(无触控事件);
CALayer一些属性改变时自带动画,如要关闭需要开启事务,在事务中关闭;
CALayer常用动画:
CABasicAnimation(核心动画)、CAKeyframeAnimation(帧动画)、CATransition(过渡动画)。
一、CALayer使用:
1.在Main.storyboard中拖入一个UIView,拖线出一个引用变量:
@property (weak, nonatomic) IBOutlet UIView *v
2.CALayer样式设置:
/*
CALayer样式设置
*/
- (void)setCALayerStyle{
//设置边框宽度
self.v.layer.borderWidth = 10;
//设置边框颜色
self.v.layer.borderColor = [UIColor blueColor].CGColor;
//设置圆角
self.v.layer.cornerRadius = 10;
//设置阴影
self.v.layer.shadowColor = [UIColor blackColor].CGColor;
//设置阴影偏移量
self.v.layer.shadowOffset = CGSizeMake(-10, 10);
//设置阴影不透明
self.v.layer.shadowOpacity = 0.5;
//设置阴影裁剪:YES为裁剪 NO为不裁剪
self.v.layer.masksToBounds = NO;
//平移
// self.v.layer.transform = CATransform3DMakeTranslation(50, 300, 0);
//旋转
// self.v.layer.transform = CATransform3DMakeRotation(M_PI_2, 10, 10, 10);
//缩放
// self.v.layer.transform = CATransform3DMakeScale(0.5, 0.5, 0.5);
//用kvc调用,实现平移
// NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeTranslation(50, 300, 0)];
// [self.v.layer setValue:value forKey:@"transform"];
//旋转
// NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_2, 10, 10, 10)];
// [self.v.layer setValue:value forKey:@"transform"];
//缩放
// NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.5, 0.5, 0.5)];
// [self.v.layer setValue:value forKey:@"transform"];
/*
用kvc调用,缩放、旋转、缩放
key名列表:
rotation.x
rotation.y
rotation.z
rotation
scale.x
scale.y
scale.z
scale
translation.x
translation.y
translation.z
translation
*/
//用kvc调用
// [self.v.layer setValue:值 forKey:@"key名"];
// 例:
// [self.v.layer setValue:[NSValue valueWithCGPoint:CGPointMake(-100, -100)] forKey:@"transform.translation"];
}
3.创建CALayer实现类试UIView的显示功能:
/*
创建CALayer实现类试UIView的显示功能
*/
- (void)createCALayer{
//创建新图层
CALayer *layer = [CALayer layer];
//背景颜色,改变时有默认动画效果
layer.backgroundColor = [UIColor blueColor].CGColor;
//xy宽高,改变时有默认动画效果
layer.bounds = CGRectMake(0, 0, 300, 300);
//相对父View位置,会被anchorPoint影响,默认以当前View的中心点相对父View,改变时有默认动画效果
layer.position = CGPointMake(200, 200);
//anchorPoint默认值为:(0.5, 0.5) 取值范围:0.0-1.0,配合 position使用,决定相对于父View的位置
layer.anchorPoint = CGPointMake(200, 200);
//圆角
layer.cornerRadius = 10;
//裁剪超出部分
layer.masksToBounds = YES;
//显示内容
layer.contents = (id) [UIImage imageNamed:@"img"].CGImage;
//实现代理
layer.delegate = self;
//将图层加入当前View中
[self.v.layer addSublayer:layer];
}
/*
实现代理方法,画图形,必须调用setNeedsDisplay方法才会绘制
*/
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{
//绘制图形
}
4.开启事务:layer默认有动画,开启事务可以关闭动画:
/*
开启事务:layer默认有动画,开启事务可以关闭动画
*/
- (void)openTransaction{
//开启事务
[CATransaction begin];
//YES没有动画, NO为默认值,有动画
[CATransaction setDisableActions:YES];
// layer.opacity = 0.5;
//提交事务
[CATransaction commit];
}
二、CALayer动画:
1.CABasicAnimation(核心动画):
说明:
形变动画,可平移、缩放、渐变等
属性:
fromValue
toValue
/*
核心动画
*/
- (void)basicAnim{
//1.创建动画
CABasicAnimation *anim = [CABasicAnimation animation];
//设置持续时间
anim.duration = 3.0;
//完成动画不回弹
anim.removedOnCompletion = NO;
anim.fillMode = kCAFillModeForwards;
//实现代理
anim.delegate = self;
//添加动画方式
[self setBasicAnimConfig:anim];
//3.添加到图层
[self.v.layer addAnimation:anim forKey:nil];
}
/*
配置核心动画属性
*/
- (CABasicAnimation *)setBasicAnimConfig:(CABasicAnimation *)anim{
//设置位移
// anim.keyPath = @"position";
// anim.fromValue = [NSValue valueWithCGPoint:CGPointMake(0, 00)];
// anim.toValue = [NSValue valueWithCGPoint:CGPointMake(200, 300)];
//设置旋转
// anim.keyPath = @"transform";
// anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 1, -1, 0)];
//或
// anim.keyPath = @"transform.rotation";
// anim.toValue = @(M_PI_2);
//缩放
anim.keyPath = @"transform.scale";
anim.toValue = @(0.5);
return anim;
}
2.CAKeyframeAnimation(帧动画):
说明:
一帧一帧播放的效果
属性:
Values
Path
keyTimes
/*
帧动画
*/
- (void)frameAnim{
//创建frame动画
CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];
//设置持续时间
anim.duration = 3.0;
//完成动画不回弹
anim.removedOnCompletion = NO;
anim.fillMode = kCAFillModeForwards;
//实现代理
anim.delegate = self;
//设置播放次数MAXFLOAT几乎为无限
anim.repeatCount = MAXFLOAT;
//添加动画方式
[self setFrameAnimConfig:anim];
//3.添加到图层
[self.v.layer addAnimation:anim forKey:nil];
}
/*
配置帧动画属性
*/
- (CAKeyframeAnimation *)setFrameAnimConfig:(CAKeyframeAnimation *)anim{
//1.1 anim.values方式:设置位移
// anim.keyPath = @"position";
// NSValue *value1 = [NSValue valueWithCGPoint:CGPointZero];
// NSValue *value2 = [NSValue valueWithCGPoint:CGPointMake(50, 50)];
// NSValue *value3 = [NSValue valueWithCGPoint:CGPointMake(100, 100)];
// anim.values = @[value1, value2, value3];
//1.2 anim.values方式:设置values中每个动画的时间
// anim.keyTimes = @[@(1), @(0.4), @(0.6)];
//2.1 anim.path方式:
anim.keyPath = @"position";
//2.2移动创建路径
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddEllipseInRect(path, NULL, CGRectMake(20, 20, 300, 300)); //画圆
anim.path = path;
CGPathRelease(path); //释放
//设置执行节奏
/*
默认:kCAMediaTimingFunctionDefault
匀速:kCAMediaTimingFunctionLinear
从慢到快:kCAMediaTimingFunctionEaseIn
从快到慢:kCAMediaTimingFunctionEaseOut
开始与结尾慢,中间快:kCAMediaTimingFunctionEaseInEaseOut
*/
anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
return anim;
}
3.CATransition(过渡动画):
说明:
转场切换的动画效果,例翻页
属性:
filter
/*
过渡动画
*/
- (void)transitionAnim{
//1.创建过渡动画
CATransition *anim = [CATransition animation];
//设置持续时间
anim.duration = 0.5;
//完成动画不回弹
// anim.removedOnCompletion = NO;
// anim.fillMode = kCAFillModeForwards;
//实现代理
// anim.delegate = self;
//设置播放次数MAXFLOAT几乎为无限
// anim.repeatCount = 1;
//2.添加动画方式
[self setTransitionAnimConfig:anim];
//3.添加到图层
[self.v.layer addAnimation:anim forKey:nil];
}
/*
配置过渡动画属性
*/
- (CATransition *)setTransitionAnimConfig:(CATransition *)anim{
//过渡类别
/*
fade:交叉淡化
push:新将旧推出去
moveIn:新移到旧上面
reveal:将旧移开,显示下面的新视图
cube:立方体翻滚
oglFlip:上下左右翻转
suckEffect:收缩效果
rippleEffect:滴水效果
pageCurl:向上翻页
pageUnCurl:向下翻页
cameraIrisHollowOpen:相机镜头打开
cameraIrisHollowClose:相机镜头关闭
*/
anim.type = @"push";
//过渡方向
/*
kCATransitionFromLeft
kCATransitionFromRight
kCATransitionFromTop
kCATransitionFromButton
*/
anim.subtype = kCATransitionFromTop;
//起点百分比,取值:0.0-1.0
anim.startProgress = 0.9;
//终点百分比,取值:0.0-1.0
anim.endProgress = 1;
return anim;
}
4.CAAnimationGroup(动画组):
说明:
可以将多个动画效果组合播放
属性:
animations
/*
动画组
*/
- (void)animGroup{
//1.创建动画组
CAAnimationGroup *group = [CAAnimationGroup animation];
//设置持续时间
group.duration = 1.0;
//完成动画不回弹
group.removedOnCompletion = NO;
group.fillMode = kCAFillModeForwards;
//2.添加动画方式
[self setAnimGroupConfig:group];
//3.添加到图层
[self.v.layer addAnimation:group forKey:nil];
}
/*
配置动画组属性
*/
- (CAAnimationGroup *)setAnimGroupConfig:(CAAnimationGroup *)group{
//1.平移动画
CABasicAnimation *translation = [CABasicAnimation animation];
translation.keyPath = @"transform.translation";
//平移到此处
translation.toValue = [NSValue valueWithCGPoint:CGPointMake(200, 200)];
//2.旋转动画
CABasicAnimation *rotate = [CABasicAnimation animation];
rotate.keyPath = @"transform.rotation";
//旋转角度
rotate.toValue = @(M_PI_2);
//3.将2个动画加入组
group.animations = @[translation, rotate];
return group;
}
5.监听动画开始与结束:
/*
动画开始
*/
- (void)animationDidStart:(CAAnimation *)anim{
NSLog(@"动画开始");
}
/*
动画结束
*/
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
NSLog(@"动画结束");
}