iOS:CALayer和CALayer动画

说明:

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(@"动画结束");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值