核心动画(一)
之前我们已经说过基础动画编程,现在开始进入更强大的核心动画编程。
首先先说Core Animation。
Core Animation是一组非常强大的动画处理API,它能做出非常绚丽的动画效果,在使用它时需要添加QuartzCore.framework和引入对应的框架<QuartzCore/QuartzCore.h>
CAAnimation
它是所有动画对象的父类,负责控制动画的持续时间和速度,是抽象类,不能直接使用,需要使用它的子类。
CAAnimation在分类中定义了以下代理方法
-(void)animationDidStart:(CAAnimation *)anim;
-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;
CAPropertyAnimation
CAAnimation的子类,也是一个抽象类,不能直接使用,需要使用它的两个子类:CABasicAnimation和CAKeyframeAnimation.
属性解析:
fromValue:keyPath相应属性的初始值
toValue:keyPath相应属性的结束值
随着动画的进行,在长度为duration的持续时间内,keyPath相应属性的值从fromValue渐渐地变为toValue
如果fillMode=kCAFillModeForwards和removedOnComletion=NO,那么在动画执行完毕后,图层会保持显示动画执行后的状态。但在实质上,图层的属性值还是动画执行前的初始值,并没有真正被改变。
CABasicAnimation
CABasicAnimation*basicAnimation = [CABasicAnimation animationWithKeyPath:@"contensScale"];
basicAnimation.fromValue = @0.0;
basicAnimation.toValue = @(image.scale);
//动画执行时间
basicAnimation.duration = 2;
//动画重复次数
basicAnimation.repeatCount = FLT_MAX;
//运动曲线,速度
basicAnimation.timingFunction = [CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunctionLinear];
//添加动画的实例对象和名称
[self.view.layer addAnimation:basicAnimation forKey:@"ani_scale"];
从上面例子可以看出
1、核心动画编程实质上是View 和layer 属性做动画
2、核心动画编程的动画效果产生,实质上改变layer 的某些属性,让其发生形变,已达到app预期效果
CALayer
1.UIView为每个子类,包括其本身都给定了一个 layer 属性
2. layer 属性的类型是 CALayer 类构造的实例对象
3. CALayer不响应用户交互,而是来做高级动画,即UI增强效果的动画。
4.那么CALayer可以做哪些事情?
1>阴影,圆角,带颜色的边框
2>3D变换
3>非矩形范围
4>透明遮罩
5>多级非线性动画
UIView有`frame`,`bounds`和`center`,`CALayer`对应地叫做`frame`,`bounds`和`position`。
`frame`代表了图层的外部坐标(也就是在父图层上占据的空间),`bounds`是内部坐标({0, 0}通常是图层的左上角),`position`代表了相对于父图层的锚点`anchorPoint`的位置(大家暂时可以将锚点想象成中心点)
//构造layer
CALayer*sub_layer = [CALayer layer];
//layer的大小
sub_layer.frame= CGRectMake(0,0, 30, 30);
//layer的背景颜色
sub_layer.backgroundColor= [UIColor blackColor].CGColor;
//设置锚点
sub_layer.anchorPoint= CGPointMake(0.5,0.5);
[aniView.layeraddSublayer:sub_layer];
//设置圆角
sub_layer.cornerRadius= 3;
sub_layer.masksToBounds= YES;
//边框
self.view.layer.borderColor = [UIColorcyanColor].CGColor;
self.view.layer.borderWidth = 2.0;
阴影
`shadowOpacity`是一个必须在0.0(不可见)和1.0(完全不透明)之间的浮点数。如果设置为1.0,将会显示一个有轻微模糊的黑色阴影稍微在图层之上;反之,阴影就可以显示在任意图层之下
`shadowColor`属性控制着阴影的颜色
`shadowOffset`属性控制着阴影的方向和距离,shadowOffset的默认值是 {0, -3},意即阴影相对于Y轴有3个点的向上位移
`shadowRadius`属性控制着阴影的模糊度,当它的值是0的时候,阴影就和视图一样有一个非常确定的边界线。当值越来越大的时候,边界线看上去就会越来越模糊和自然
aniView.layer.shadowOpacity = 0.5;
aniView.layer.shadowColor = [UIColororangeColor].CGColor;
aniView.layer.shadowOffset = CGSizeMake(13, 10);
aniView.layer.shadowRadius = 3;
//图层的contents属性
self.view.layer.contents = (__bridgeid)[UIImageimageNamed:@"5.png"].CGImage;
//改变cotents的属性
/*
- kCAGravityCenter
- kCAGravityTop
- kCAGravityBottom
- kCAGravityLeft
- kCAGravityRight
-kCAGravityTopLeft
-kCAGravityTopRight
-kCAGravityBottomLeft
-kCAGravityBottomRight
- kCAGravityResize
-kCAGravityResizeAspect
-kCAGravityResizeAspectFill
*/
//contentGravitylayer放置位置
self.view.layer.contentsGravity = kCAGravityCenter;
//contentsRect截取layer的某一部分
// self.view.layer.contentsRect = CGRectMake(0, 0, 1, 0.9);
//contentsScale
self.view.layer.contentsScale = image.scale;