嗷呜嗷呜嗷呜

1 // 将视图作为属性方便后面执行多个不同动画
2 _myView = [[UIView alloc] init];
3 _myView.layer.position = CGPointMake(100, 100);
4 _myView.layer.bounds = CGRectMake(0, 0, 100, 100);
5 _myView.backgroundColor = [UIColor blueColor];
6 [self.view addSubview:_myView];
7 [_myView release];

平移动画(1)

 1 // 创建一个CABasicAnimation类型的动画对象并对CALayer的position属性执行动画
 2 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position"];
 3
 4 // 动画持续1.5s
 5 anim.duration = 1.5;
 6
 7 // position属性值从(50, 80)渐变到(300, 350)
 8 anim.fromValue = [NSValue valueWithCGPoint:CGPointMake(50, 80)];
 9 anim.toValue = [NSValue valueWithCGPoint:CGPointMake(300, 350)];
10
11 // 设置动画的代理
12 anim.delegate = self;
13
14 // 保持动画执行后的状态
15 anim.removedOnCompletion = NO;
16 anim.fillMode = kCAFillModeForwards;
17
18 // 添加动画对象到myView的图层上
19 [_myView.layer addAnimation:anim forKey:@"translate"];

  • 上面实现了平移动画
  • 想要实现不同的效果,最关键的地方就是第2行CABasicAnimation对象的初始化方法中keyPath的设定。必须是CALayer的某项属性。
  • 第8、9行这里的属性接收的是id类型的参数所以不能直接使用CGPoint这种结构体类型,而是要先包装成NSValue对象后再使用。
  • 注意:可以尝试将第9行的toValue换成byValue  区别:前者是到指定的位置,后者是在当前的位置上增加多少

  • 默认情况下,动画执行完毕后,动画会自动从CALayer上移除,CALayer又会回到原来的状态。为了保持动画执行后的状态,可以加入第15、16行代码

    fillMode的作用就是决定当前对象过了非active时间段的行为。比如动画开始之前,动画结束之后。如果是一个动画CAAnimation,则需要将其removedOnCompletion设置为NO,要不然fillMode不起作用.

    kCAFillModeRemoved 默认值 也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态 
    kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态 
    kCAFillModeBackwards 这个和kCAFillModeForwards是相对的,就是在动画开始前,你只要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始.你可以这样设定测试代码,将一个动画加入一个layer的时候延迟5秒执行.然后就会发现在动画没有开始的时候,只要动画被加入了layer,layer便处于动画初始状态 
    kCAFillModeBoth 理解了上面两个,这个就很好理解了,这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态.

  • 第19行后面的@"translate"只是给动画对象起了个名称,也可以直接给个nil,但是为方便以后可以调用CALayer的removeAnimationForKey:方法根据动画名称来移除相应的动画
  • 第12行后面的self是视图控制器。代理需要实现的方法:
 1 #pragma mark -----动画开始-----
 2 - (void)animationDidStart:(CAAnimation *)anim {
 3 NSLog(@"动画开始了");
 4 }
 5
 6 #pragma mark -----动画结束-----
 7 - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
 8 // 查看一下动画执行完毕后的position值
 9 NSString *string = NSStringFromCGPoint(_myView.layer.position);
10 NSLog(@"动画结束了,position:%@", string);
11 }

运行后发现, 在实质上,图层的属性值还是动画执行前的初始值,并没有真正被改变。

1 // 移除动画
2 [_myView.layer removeAnimationForKey:@"translate"]

平移动画(2)

1 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
2 anim.duration = 1;
3
4 CATransform3D form = CATransform3DMakeTranslation(350, 350, 0);
5 anim.toValue = [NSValue valueWithCATransform3D:form];
6
7 [_myView.layer addAnimation:anim forKey:nil];

  • 通过CALayer的transform属性实现平移动画,layer会从自己的初始位置平移到(350, 350)位置
  • 通过transform(KVC)的方式来进行设置,可以简单实现3D效果的平移、缩放、旋转效果。
  • 可查看API文档搜索CABasicAnimation animationWithKeyPath Types

缩放动画(1)

1 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"bounds"];
2 anim.duration = 2;
3
4 anim.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 30, 30)];
5
6 [_myView.layer addAnimation:anim forKey:nil];

通过CALayer的bounds属性实现缩放动画,layer会从原来的尺寸(100x100)变为30x30

缩放动画(2)

 1 CABasicAnimation *anim = [CABasicAnimation
 2 animationWithKeyPath:@"transform"];
 3 anim.duration = 1.5; // 动画持续1.5s
 4
 5 // CALayer的宽度从0.5倍变为2倍
 6 // CALayer的高度从0.5倍变为1.5倍
 7 anim.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.5, 0.5, 1)];
 8 anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(2, 1.5, 1)];
 9
10 [_myView.layer addAnimation:anim forKey:nil];

旋转动画

1 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
2 anim.duration = 1.5;
3
4 // 绕着(1, 1, 0)这个向量轴顺时针旋转45°
5 anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_4, 1, 1, 0)];
6
7 [_myView.layer addAnimation:anim forKey:nil];

  • 提示:如果要仅需要图形以2D的方式旋转,只要把CATransform3DMakeRotation在z方向上的值改为1即可。

    anima.toValue=[NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_4, 1, 1, 0)];

  • 通过以上可以发现其实可以不用设置fromValue,只设置了toValue
  • CABasicAnimation虽然能够做很多基本的动画效果,但是有个局限性,只能让CALayer的属性从某个值渐变到另一个值,仅仅是在2个值之间渐变

转载于:https://www.cnblogs.com/xs514521/p/5192378.html

之一:CABasicAnimation - 基本动画相关推荐

  1. CABasicAnimation,CAKeyframeAnimation,CATransition,CAAnimationGroup,UIBezierPath之间做动画的不同点和各自的使用范围。

    CABasicAnimation,CAKeyframeAnimation,CATransition,CAAnimationGroup,UIBezierPath之间做动画的不同点和各自的使用范围. CA ...

  2. iOS动画详解(学习动画看这一篇就够了)

    2019独角兽企业重金招聘Python工程师标准>>> 原文出处:wu大维 动效设计一直是iOS平台的优势,良好的动效设计可以很好地提升用户体验.而动画则是动效的基础支撑.本动画将从 ...

  3. iOS动画系列之五:基础动画之缩放篇旋转篇Swift+OC

    这一篇主要介绍基础动画之缩放和旋转.这些基本操作分享完之后,我想想可以找个稍微复杂一点点的动画做做啦. 这篇继续基础篇,分享一下缩放和旋转.因为整体思路和平移基本上没有变化,加上源代码里面也有OC版本 ...

  4. CoreAnimation--CALayer的动画

    CoreAnimation--CALayer的动画 核心动画中所有类都遵守CAMediaTiming CAAnaimation和CAPropertyAnimation都是抽象类,本身不具备动画效果,必 ...

  5. iOS中 Animation 动画大全 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博! iOS开发者交流QQ群: 446310206 1.iOS中我们能看到的控件都是UIView的子类,比如UIButt ...

  6. iOS - Core Animation 核心动画

    1.UIView 动画 具体讲解见 iOS - UIView 动画 2.UIImageView 动画 具体讲解见 iOS - UIImageView 动画 3.CADisplayLink 定时器 具体 ...

  7. iOS 核心动画 Core Animation浅谈

    代码地址如下: http://www.demodashi.com/demo/11603.html 前记 关于实现一个iOS动画,如果简单的,我们可以直接调用UIView的代码块来实现,虽然使用UIVi ...

  8. iOS核心动画Core Animation(一)

    核心动画Core Animation(一) 一.简述 Core Animation是直接作用在CALayer上的(并非UIView上)非常强大的跨Mac OS X和iOS平台的动画处理API,Core ...

  9. iOS:动画(18-10-15更)

    目录 1.UIView Animation 1-1.UIView Animation(基本使用) 1-2.UIView Animation(转场动画) 2.CATransaction(Layer版的U ...

最新文章

  1. ormlite android studio,OrmLite-android入门体验
  2. 四路服务器芯片组,四路服务器主板配置
  3. WCF分布式开发步步为赢(1):WCF分布式框架基础概念
  4. SQL查询入门(下篇)
  5. PHP编程最快明白 by www.kuphp.com 案例实战zencart1.38a支付模块简化Fast and Easy Checkout配置...
  6. NYOJ737 石子合并(一)区间动态规划
  7. docker概念很乱?俺来替你理一下!
  8. Windows服务的创建、安装、调试
  9. python中lxml模块的使用
  10. git 发布android 系统版本 修改版本型号 查看指定文件的修改记录
  11. 宝塔面板插件 sitemap生成器(附神马/百度主动推送)
  12. zigzag模式提取矩阵元素
  13. Base64 编码介绍
  14. 蓝桥杯 ADV-79 算法提高 时间转换
  15. 「leetcode」738.单调递增的数字【贪心算法】详细讲解!
  16. lintcode 丢鸡蛋
  17. Java Excel 导出为 PDF
  18. Win11录屏数据保存在哪里?Win11录屏数据保存的位置
  19. python之爬虫(十一) 实例爬取上海高级人民法院网开庭公告数据
  20. 近期活动盘点:个人消费信贷与风险控制讲座、清华大学教育大数据论坛

热门文章

  1. python自带的url提取器
  2. tensorflow的错误之Can not convert a float32 into a Tensor or Operation
  3. Regex Tester (免费有用)
  4. 第10章:项目沟通管理和干系人管理-章节重点
  5. 笔记-项目质量管理-七种基本质量工具
  6. Vue中使用vue-video-player和videojs-flash插件实现播放rtmp视频文件流
  7. Vue中绑定值与字符串拼接以及结合三目表达式实现是否为空判定的使用
  8. SpringBoot集成OpenOffice实现doc文档转html
  9. EL表达式中格式化日期显示
  10. 通过XShell将linux服务器上的Tomcat下项目部署后,怎样对日志操作来调试