iOS中的CoreAnimation

核心动画,也是iOS常用的东西。但以前的时候居然很少用到,唉。在此需好好记录一下。

Core Animation,核心动画,是一组非常强大的动画处理API。Core Animation是直接作用在CALayer上的,并不是UIView。

Core Animation依然在QuartzCore.framework中,这个框架已经默认加入了工程,因此只需导入头文件就行了。

先来看看Core Animation里面的继承结构:

其中CAMediaTiming是协议。在使用过程中,一般不会直接使用CAAnimation类,而是使用它的子类CABasicAnimation等。其中CAPropertyAnimation也是不能直接使用的,它是提供一个NSString类型的keyPath属性,你可以指定CALayer的某个属性名为keyPath,并且对CALayer的这个属性的值进行修改,达到相应的动画效果。比如,指定@”position”为keyPath,就会修改CALayer的position属性的值,以达到平移的动画效果。因此,初始化好CAPropertyAnimation的子类对象后,必须先设置keyPath,搞清楚要修改的是CALayer的哪个属性,执行的是怎样的动画

Core Animation使用步骤如下:

  1. 初始化一个CAAnimation对象,并设置一些动画相关属性;
  2. 通过调用CALayer的addAnimation:forKey:方法增加CAAnimation对象到CALayer中,这样就能开始执行动画;
  3. 通过调用CALayer的removeAnimationForKey:方法可以停止CALayer中的动画.

CAAnimation的常用属性有以下几种:

  1. duration:动画的持续时间;
  2. repeatCount:动画的重复次数;
  3. timingFunction:控制动画运行的节奏;
    timingFunction可选的值有:
    kCAMediaTimingFunctionLinear(线性):匀速,给你一个相对静态的感觉;
    kCAMediaTimingFunctionEaseIn(渐进):动画缓慢进入,然后加速离开;
    kCAMediaTimingFunctionEaseOut(渐出):动画全速进入,然后减速的到达目的地;
    kCAMediaTimingFunctionEaseInEaseOut(渐进渐出):动画缓慢的进入,中间加速,然后减速的到达目的地。这个是默认的动画行为。
  4. delegate:动画代理,用来监听动画的执行过程.

其中代理方法有:

@interface NSObject (CAAnimationDelegate)
// 动画开始执行的时候触发这个方法
-(void)animationDidStart:(CAAnimation *)anim;
// 动画执行完毕的时候触发这个方法
-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;
@end

下面举几个例子:
我们在用动画的时候,一般用CABasicAnimation类。

平移动画:

- (void)viewDidLoad {
    [super viewDidLoad];

    _subView = [[UIView alloc] init];
    _subView.layer.position = CGPointMake(100, 100);
    _subView.layer.bounds = CGRectMake(0, 0, 100, 100);
    _subView.backgroundColor = [UIColor redColor];
    [self.view addSubview:_subView];

    //平移动画
    CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position"];
    anim.duration = 1.5;

    anim.fromValue = [NSValue valueWithCGPoint:CGPointMake(50, 80)];

    //也可以通过transform属性来设置
    //CATransform3D form = CATransform3DMakeTranslation(350, 350, 0);
    //anim.toValue = [NSValue valueWithCATransform3D:form];

    anim.delegate = self;

    //保持动画执行后的状态
    anim.removedOnCompletion = NO;
    anim.fillMode = kCAFillModeForwards;

    [_subView.layer addAnimation:anim forKey:@"translate"];

}

缩放动画:

//缩放动画
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"bounds"];
anim.duration = 2;

anim.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 30, 30)];

[_subView.layer addAnimation:anim forKey:nil];

旋转动画:

CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
anim.duration = 1.5;

// 绕着(0, 0, 1)这个向量轴顺时针旋转45°
anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_4, 0, 0, 1)];

[_subView.layer addAnimation:anim forKey:nil];

CABasicAnimation改变视图的方式就是通过初始化的时候的keyPath来找CALayer中对应的属性,可以从官方文档中查询所有的Animatable Properties。

CABasicAnimation只能让CALayer的属性从某个值渐变到另一个值,仅仅是在2个值之间渐变。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值