CALayer&Core Animation核心动画

CALayer和UIView的关系

CALayer负责视图中显示的内容和动画
UIView负责监听和响应事件
UIView本身不具备显示的功能,是它内部的层才有显示功能

//创建图层
    CALayer *layer = [CALayer layer];
    layer.backgroundColor = [UIColor redColor].CGColor;
    layer.frame = CGRectMake(50, 50, 100, 100);
    // 设置layer的内容
    layer.contents = (id)[UIImage imageNamed:@"图片"].CGImage;
   // 添加到控制器的View的layer上面
    [self.view.layer addSublayer:layer];

    // 设置阴影 Opacity:不透明度 NO:透明
    layer.shadowOpacity = 1;
    //阴影偏移量
    layer.shadowOffset = CGSizeMake(-20, -20);
    //阴影圆角
    layer.shadowRadius = 30;
    // UIKit -> CoreGraphics .CG
    layer.shadowColor = [UIColor yellowColor].CGColor;
    // 设置圆角半径
    layer.cornerRadius = 50;
    // 超出主层的部分全部裁剪掉
    layer.masksToBounds = YES;
   // 设置边框
    layer.borderWidth = 3;
    layer.borderColor = [UIColor whiteColor].CGColor;
//用来设置CALayer在父层中的位置
//以父层的左上角为原点(0, 0)
@property CGPoint position;
//“锚点”决定着CALayer身上的哪个点会在position属性所指的位置
//它的x、y取值范围都是0~1,默认值为(0.5, 0.5)
@property CGPoint anchorPoint;

注: 如果默认设置bounds属性  则position默认为(0,0);

非根层layer的隐式动画

// 默认的View的layer是根层,没有隐式动画
通过改变layer的
position  cornerRadius borderWidth backgroundColor borderColor 属性 会进行隐式动画
    //默认每个动画都会包装到一个事务
    // 执行隐式动画之前去设置这个动画时长
    [CATransaction setAnimationDuration:1];
    //禁止隐式动画
    [CATransaction beign]
    [CATransaction setDisableActions:Yes]
    [CATransaction commit]

layer的形变 可通过KVC来快速变形

//缩放
[self.redView.layer setValue:@0.5 forKeyPath:@"transform.scale"];
//旋转
 [self.redView.layer setValue:@M_PI forKeyPath:@"transform.rotation.y"];

自定义Layer

setNeedsDisplay方法
底层调用
- (void)drawInContext:(CGContextRef)ctx;
设置代理后
调用
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx ;
(两个同时实现 最终呈现的是drawInContext方法的效果)

注:
1.CALayer是定义在QuartzCore框架中的(Core Animation)
2.CGImageRef、CGColorRef两种数据类型是定义在CoreGraphics框架中的
3.UIColor、UIImage是定义在UIKit框架中的

QuartzCore框架和CoreGraphics框架是可以跨平台使用的,在iOS和Mac OS X上都能使用
但是UIKit只能在iOS中使用
为了保证可移植性,QuartzCore不能使用UIImage、UIColor,只能使用CGImageRef、CGColorRef

CoreAnimation

这里写图片描述
1.Mac OS iOS 跨平台
2.动画执行过程在后台操作 ,不会阻塞线程
3.是作用在CAlayer上的

使用方法

CABasicAnimation

CABasicAnimation *anim = [CABasicAnimation animation];
    // 更改layer的哪个属性进行核心动画,
    anim.keyPath = @"transform.scale";
    // 改变什么样的值
    anim.toValue = @0.5;;
    // 取消反弹
    // 在动画执行完毕的时候不要移除动画
     anim.removedOnCompletion = NO;
//     保持最新的模式
      anim.fillMode = kCAFillModeForwards;

    // 设置动画的执行次数,MAXFLOAT最大的执行次数
    anim.repeatCount = MAXFLOAT;
    [self.layer addAnimation:anim forKey:nil];

CAKeyframeAnimation

CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];

        // 设置动画属性
        anim.keyPath = @"transform.rotation";
        // 设置动画的值
        anim.values = @[@(-5 / 180.0 *M_PI),@(5 / 180.0 *M_PI)];
        anim.duration = 2;
        // 自动反转
        anim.autoreverses = YES;
        // 设置动画次数
        anim.repeatCount = MAXFLOAT;
        [self.iconView.layer addAnimation:anim forKey:nil];

转场动画CATransition

// 注意点:过渡代码一定要和转场代码放在一起
    CATransition *anim = [CATransition animation];
    anim.type = @"cube";
    anim.subtype = kCATransitionFromTop;
    anim.duration = 2;
    // 设置动画进度
//    anim.startProgress = 0.5;
    [self.imageView.layer addAnimation:anim forKey:nil];

动画组CAAnimationGroup

    CAAnimationGroup *group = [CAAnimationGroup animation];
    // 平移
    CABasicAnimation *animT = [CABasicAnimation animation];
    animT.keyPath = @"transform.translation";
    NSValue *ponitV = [NSValue valueWithCGPoint:CGPointMake(50, 50)];
    // 在原来的基础上偏移位置
    animT.byValue = ponitV;

    // 缩放
    CABasicAnimation *animS = [CABasicAnimation animation];
    animS.keyPath = @"transform.scale";
    animS.toValue = @0.5;

    // 旋转
    CABasicAnimation *animR = [CABasicAnimation animation];
    animR.keyPath = @"transform.rotation";
    animR.toValue = @(M_PI);

    // 同时做很多动画
    group.animations = @[animT,animS,animR];

    // 取消反弹
    group.removedOnCompletion = NO;
    group.fillMode = kCAFillModeForwards;
    [self.imageView.layer addAnimation:group forKey:nil];

Animation代理

//不用遵守任何协议 只需要设置代理
anim.delegate = self;
// 分类也可以叫做非正式协议
- (void)animationDidStart:(CAAnimation *)anim;
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;

注:
1. 核心动画一些都是假象,并不能真实的改变属性的值
2. 如果一个动画不需要于用户交互,通常就使用核心动画,转场动画一般都使用核心动画
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值