iOS之动画学习笔记二

今天,我趁着项目空暇之余,把有关CAAnimation以及它的子类的相关属性和方法都罗列一遍。以便将来在忘记的时候能够快速拾起。

一、CAAnimation(The base animation class)

它有两个私有属性:

void *_attr;

uint32_t _flags;

// 暂时不知道它的用途 -。- 以后补上。

+ (instancetype)animation;

// 创建动画实例对象的工厂方法

+ (nullable
id)defaultValueForKey:(NSString *)key;

// 苹果文档上这么描述:

Specifies the default value associated with the specified key.The default value for the named property. Returns nil if no default
value has been set.If key is not a known for property of the class, the result of the method is undefined.

也就是说我们根据属性名可以得到一个相关的值,假如我们没有设置那么就会返回nil。相当于一种全局设置。一般用在自定义的动画中,与CALayer的同名方法一样。

例如我们在自定义的动画的实现文件中覆写父类的这个方法。那么,我们在用到这个自定义动画的时候,在不设置时间duration的情况下,都是2s。

+ (id)defaultValueForKey:(NSString *)key {

if ([keyisEqualToString:@"duration"]) {

return 2.f;

}

return [superdefaultValueForKey:key];

}

- (BOOL)shouldArchiveValueForKey:(NSString *)key;

// 子类重写这个方法设置属性是否可以被归档

@property(nullable,strong)
CAMediaTimingFunction *timingFunction;

// 一个动画与时间的函数。默认的函数是一条直线,也就是动画均匀变化

// 例如:[anime setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]];

@property(nullable,strong)
id delegate;

// 动画代理,一共有两个代理方法:

- (void)animationDidStart:(CAAnimation *)anim;

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;

@property(getter=isRemovedOnCompletion)BOOL removedOnCompletion;

// 当这个值是YES的时候,当前动画对象会在动画时间duration结束的时候会从render tree树上移除掉。默认是YES

// 这个属性可以配合fillMode使用;以及代理方法DidStop...例如在用代理方法DidStop设置一个动画结束后执行另一个方法,那么我们必须确保前一个动画存在。因此 anim.removedOnCompletion = YES;

二、CAPropertyAnimation(继承自CAAnimation)

+ (instancetype)animationWithKeyPath:(nullableNSString *)path;

// 创建动画实例的同时定义动画的方式

@property(nullable,copy)
NSString *keyPath;

// 用来描述动画的方式

// 例如:anim.keyPath = @"position";  // 平移

anim.keyPath = @"lineWidth"; // 线宽

anim.keyPath = @"strokeEnd"; // 画线结束动画

...

@property(getter=isAdditive)BOOL additive;

@property(getter=isCumulative)BOOL cumulative;

@property(nullable,strong)
CAValueFunction *valueFunction;

// 暂时摸不清楚它们的用途,不过我们可以试着理解文档的意思

// 在这之前先了解一下layer。我在一篇博客中看到,有句话这么说的,一个个Layer通过tree的结构组织起来,在Display的过程中实际上有3种Layer
tree。

  • model layer tree
  • presentation tree
  • render tree
  • model
    Layer tree 中的Layer是我们通常意义说的Layer。当我们修改layer中的属性时,就会立刻修改model layer tree。
  • presentation
    tree 是Layer在屏幕中的真实位置。比如我们创建一个动画
  • render
    tree 在apple的render server进程中,是真正处理动画的地方。而且线程的优先级也比我们主线程优先级高。所以有时候即使我们的App主线程busy,依然不会影响到手机屏幕的绘制工作

// valueFunction 在设置这个属性后,将会被插入到当前的动画目标属性中。不过具体怎样的功能暂时没找到,有知道大神劳烦告诉一下。

三、CABasicAnimation(继承自CAPropertyAnimation)

这个比较长用,用法也比较简单

@property(nullable,strong)
id fromValue;

@property(nullable,strong)
id toValue;

@property(nullable,strong)
id byValue;

可以看我第一篇的有关CAShapLayer的动画,其中就有例子介绍,这里就不过多阐述。

四、CAKeyAnimation(继承自CAPropertyAnimation)

@property(nullable,copy)
NSArray *values;

// 每一帧动画对应的值,这个值可以参考CABasicAnimation里面的三个value属性。

@property(nullable)CGPathRef path;

// 当我们设置path的值的时候,会重写values数组中的值

// 和BezierPath一起结合使用

// 例如:

anim.keyPath =@"position";

anim.path = [[UIBezierPathbezierPathWithArcCenter:CGPointMake(200,200)
radius:100startAngle:0endAngle:M_PI
*2
clockwise:YES]CGPath];

我们可以让制定layer按bezierPath设定的那样运动。

@property(nullable,copy)
NSArray<NSNumber *> *keyTimes;

// 和values相对的,表示每一帧动画的时刻,这个要看总的key Animation 的时长。它的取值范围是[0,1];

// 例如:keyAnim.keyTimes =@[@0.2f,
@0.5f,
@0.75f, @1.0f];也就是在keyAnim.duration的百分之20执行values的一个动画,百分之50的时候执行values的下一个,一次类推。

@property(nullable,copy)NSArray<CAMediaTimingFunction
*> *timingFunctions;

// 这个是动画显示的方式,如渐进,渐出等

// 这里要注意,当我们在values中设置有n个值的时候,那么在timingFunctions中就改设置n-1个值。每一个function描述的都是从一帧到下一帧的过程。

@property(copy)NSString *calculationMode;

// calculation计算

// 人为指定关键帧动画的持续方式(或显示方式),一旦设定这个值后,keyTimes 和 timingFunctions都将失去作用。

// 它有5种形式的显示:

kCAAnimationLinear // 直线型的,默认

kCAAnimationDiscrete // 离散型的,就是短短续续的感觉

kCAAnimationPaced // 匀速的

kCAAnimationCubic // 字面意思是立方体的,想过上就感觉先快后慢,和弹簧那样很自然

kCAAnimationCubicPaced // 结合体,感觉效果很机械

@property(nullable,copy)
NSArray<NSNumber *> *tensionValues;

@property(nullable,copy)
NSArray<NSNumber *> *continuityValues;

@property(nullable,copy)
NSArray<NSNumber *> *biasValues;

// 这三个属性是对每一帧的细节上的设置,分别是张力值、持续性值、偏移值。具体的我也没去测试,如果有知道的劳烦告知下,哈。

@property(nullable,copy)
NSString *rotationMode;

// 确定动画对象是否允许按路径移动的时候去匹配路径的切面。意思就是在移动的时候要不要使layer也旋转来匹配path的切面,与path属性结合使用。在没有设置path的时候,这个属性不起作用。默认nil

// 一共两个option:

kCAAnimationRotateAuto // 头朝外(我也解释不清楚,自己去试试就明白了)

kCAAnimationRotateAutoReverse // 头朝内

五、CASpringAnimation(继承自CABasicAnimation)

// 过场动画的用法就是在创建好一个视图比如ImageView的时候,给这个视图添加一个CATransition,然后在后面加上不同的图片,效果就出来了。

@property CGFloat mass;

// 在弹簧动画结束时的质量,至少要大于0,默认是1.

@property CGFloat stiffness;

// 弹簧钢度系数,必须大于0,默认100.

@property CGFloat damping;

// 弹簧阻尼系数,必须大于等于0,默认10.

@property CGFloat initialVelocity;

// 初速度,默认0

@property(readonly)CFTimeInterval settlingDuration;

六、CATransition(继承自CAAnimation)

@property(copy)NSString *type;

// 转场动画的类型

// 附上一张从别处拿来的type图。不过我发现下面有好几种方法都没找到-。~

@property(nullable,copy)
NSString *subtype;

// 子类型的过场形势

// 四种:

kCATransitionFromRight

kCATransitionFromLeft

kCATransitionFromTop

kCATransitionFromBottom

@propertyfloat startProgress;

@property float endProgress;

// 范围0~1

@property(nullable,strong)
id filter;

// 暂不明白作用

今天就写着么多了,有好多都不明白-。~ ,没办法,谁让我是小白呢。以后我会不定时的写自己学习的笔记,希望我们能够一起进步。

时间: 2024-07-28 14:17:03

iOS之动画学习笔记二的相关文章

iOS之动画学习笔记一

iOS复杂动画都是和贝塞尔曲线结合在一起的.因此要学会iOS动画,必须先理解贝塞尔曲线.贝塞尔曲线的教程网上很多,这里就不过多的阐述.主要还是来讲讲有关动画方面的东西. 一.画一条简单的曲线 我们先准备一条波浪形的贝塞尔曲线: CGPoint startPoint = CGPointMake(50, 300); CGPoint endPoint = CGPointMake(300, 300); CGPoint onePoint = CGPointMake(150, 200); CGPoint t

iOS开发ReactiveCocoa学习笔记(二)

RAC 中常见的宏: 使用宏定义要单独导入 #import <RACEXTScope.h> 一. RAC(TARGET, [KEYPATH, [NIL_VALUE]]):用于给某个对象的某个属性绑定 只要文本框文字改变,就会修改label的文字 RAC(self.labelView,text) = _textField.rac_textSignal; 二. RACObserve(self, name):监听某个对象的某个属性,返回的是信号. [RACObserve(self.view, cen

IOS图层Layer学习笔记(二)—— CALayer(上)

IOS图层Layer学习笔记(二)-- CALayer(上) 简介 CALayer是所有图层的基类.主要是一些基本显示属性(位置.锚点.颜色.透明度等).层次关系(子图层和父图层).基本动画等. 接下来分别从常用属性.类方法和实例方法来介绍CALayer的使用.顺序是按头文件的排序来. 常用属性 bounds CGRect,Animatable.控制layer的大小,其中x和y无效果,默认是(0,0). position CGPoint,Animatable.控制layer锚点在父图层的位置.

小猪的数据结构学习笔记(二)

小猪的数据结构学习笔记(二) 线性表中的顺序表 本节引言: 在上个章节中,我们对数据结构与算法的相关概念进行了了解,知道数据结构的 逻辑结构与物理结构的区别,算法的特性以及设计要求;还学了如何去衡量一个算法 的好坏,以及时间复杂度的计算!在本节中我们将接触第一个数据结构--线性表; 而线性表有两种表现形式,分别是顺序表和链表;学好这一章很重要,是学习后面的基石; 这一节我们会重点学习下顺序表,在这里给大家一个忠告,学编程切忌眼高手低,看懂不代表自己 写得出来,给出的实现代码,自己要理解思路,自己

Android学习笔记二十九之SwipeRefreshLayout、RecyclerView和CardView

Android学习笔记二十九之SwipeRefreshLayout.RecyclerView和CardView 前面我们介绍了AlertDialog和几个常用的Dialog,ProgressDialog进度条提示框.DatePickerDialog日期选择对话框和TimePickerDialog时间选择对话框.这一节我们介绍几个新的API控件SwipeRefreshLayout.RecyclerView和CardView,这几个API控件都是google在Android5.0推出的.下面我们来学

绘图与动画学习笔记(一)

1. 处理图形与动画的框架有 UIKit 高层次的框架,允许开发人员创建视图.窗口.按钮和其他UI相关的组件.它还将一些低级别的API引入到易于使用的高级别API中 Quartz 2D iOS上绘图的主要引擎:UIKit就使用Quartz. Core Graphics 它支持图形上下文.加载图像.绘制图像,等等. Core Animation 顾名思义,是一个帮助开发者在IOS上实现动画的框架 2. UIColor的set方法可设置Graphical context的颜色 - (void)dra

Silverlight动画学习笔记(三):缓动函数

(一)定义: 缓动函数:可以将自定义算术公式应用于动画 (二)为什么要用缓动函数: 您可能希望某一对象逼真地弹回或其行为像弹簧一样.您可以使用关键帧动画甚至 From/To/By 动画来大致模拟这些效果,但可能需要执行大量的工作,并且与使用算术公式相比动画的精确性将降低. (三)实例讲解: 1 <UserControl x:Class="AnimationStudy.EasingFunctionAnimation" 2 xmlns="http://schemas.mic

Android学习笔记二十之Toast吐司、Notification通知、PopupWindow弹出窗

Android学习笔记二十之Toast吐司.Notification通知.PopupWindow弹出窗 Toast吐司 Toast吐司是我们经常用到的一个控件,Toast是AndroidOS用来显示消息的一种机制,它与Dialog不同,Toast不会获取到焦点,通常显示一段时间之后就会自动消失,下面我们来介绍Toast的几种常用方式: 第一种,默认显示方式,也是最常用的方式: Toast.makeText(MainActivity.this, "这是默认的显示方式", Toast.LE

CCNA 学习笔记(二)--CISCO设备初接触

CCNA 学习笔记(二)--初识CISCO设备 上一章我们认识到网络方面的基础知识了,现在我们正式接触CISCO设备. 1.首先我们先了解一台CISCO设备里的主要组件: ROM(只读存储器):主要保存着开机自检软件.保存路由器启动引导程序. RAM(随机存储器):断电会把数据丢失.可以存储配置文件.>>>相当于PC的内存 NVRAM(非易失存储器):断电不会丢失.用来保存用户配置文件.IP.startup-config.主机名.路由协议等等. FLASH(闪存):主要是保存完整的