POP简介
Facebook Pop其实是基于CADisplayLink(Mac平台上使用的CVDisplayLink)实现的独立于Core Animation之外的动画方案
与Core Animation对比
Pop Animation在使用上和Core Animation很相似,都涉及Animation对象以及Animation的载体的概念,不同的是Core Animation的载体只能是CALayer,而Pop Animation可以是任意基于NSObject的对象。当然大多数情况Animation都是界面上显示的可视的效果,所以动画执行的载体一般都直接或者间接是UIView或者CALayer。
Pop Animation应用于CALayer时,在动画运行的任何时刻,layer和其presentationLayer的相关属性值始终保持一致,而Core Animation做不到。
POP动画结构
POP默认支持三种动画,但同时也支持自定义动画。
//继承自POPPropertyAnimation ,POPPropertyAnimation继承自POPAnimation
POPBasicAnimation //基础动画
POPSpringAnimation //弹簧动画
POPDecayAnimation //减速动画
//继承自POPAnimation
POPCustomAnimation //自定义动画
POPAnimation
属性
@property (assign, nonatomic) CFTimeInterval beginTime; //开始时间
@property (weak, nonatomic) id delegate; //代理,
@property (readonly, nonatomic) POPAnimationTracer *tracer;
@property (copy, nonatomic) void (^animationDidStartBlock)(POPAnimation *anim); //动画开始block
@property (copy, nonatomic) void (^animationDidReachToValueBlock)(POPAnimation *anim); //完成到valueblock
@property (copy, nonatomic) void (^completionBlock)(POPAnimation *anim, BOOL finished); //完成block
@property (copy, nonatomic) void (^animationDidApplyBlock)(POPAnimation *anim); //动画途中多次调用。
@property (assign, nonatomic) BOOL removedOnCompletion; //完成移除
@property (assign, nonatomic, getter = isPaused) BOOL paused; //暂停
@property (assign, nonatomic) BOOL autoreverses; //返回原点
@property (assign, nonatomic) NSInteger repeatCount; //重复次数
@property (assign, nonatomic) BOOL repeatForever; //一直重复
代理方法
- (void)pop_animationDidStart:(POPAnimation *)anim; //动画开始调用
- (void)pop_animationDidReachToValue:(POPAnimation *)anim; //到达value调用
- (void)pop_animationDidStop:(POPAnimation *)anim finished:(BOOL)finished; //结束动画调用
POPPropertyAnimation
使用动画时需要指定animationProperty。具体的值参考POPAnimatableProperty.mm文件
属性
@property (strong, nonatomic) POPAnimatableProperty *property; //动画性质
@property (copy, nonatomic) id fromValue; //动画初始值 需要与property类型对应 不写默认当前值
@property (copy, nonatomic) id toValue; //动画目标值 需要与property类型对应
属性与value对应关系
单个float类型:
//写法
anBasic.toValue = @(2.0f);
anBasic.toValue = [NSValue valueWithCGPoint:CGPointMake(2.0f, 3.0f)];//只有第一个值有效
anBasic.toValue = [NSValue valueWithCGRect:CGRectMake(3.14f, 0, 0, 0)];//只有第一个值有效
//属性类型
Alpha //透明值 取值区间[0,1] 0时完全消失,不能响应事件
Opacity //透明值 取值区间[0,1] 0时完全消失,不能响应事件
ScaleX //宽度放大倍数
ScaleY //高度放大倍数
positionX //中心点X坐标位置
positionY //中心点Y坐标位置
Rotation //顺时针旋转π为一周
RotationX //绕中心X轴旋转π为一周
RotationY //绕中心Y轴旋转π为一周
BorderWidth //边距
...
两个float类型:
//写法
anBasic.toValue = [NSValue valueWithCGPoint:CGPointMake(2.0f, 3.0f)];
anBasic.toValue = [NSValue valueWithCGRect:CGRectMake(3.14f, 5.0f, 0, 0)];//只有前两个值有效
//属性类型
Size //宽高
ScaleXY //宽高放大倍数
position //中心点XY值
Center //中心点XY值
四个float类型:
//写法
anBasic.toValue = [NSValue valueWithCGRect:CGRectMake(100, 100, 100, 100)];
//属性类型
frame
bounds
color类型
//写法
anBasic.toValue = [UIColor blueColor];
PopBasicAnimation
特有属性
@property (assign, nonatomic) CFTimeInterval duration; //持续时长
@property (strong, nonatomic) CAMediaTimingFunction *timingFunction; //赛贝尔曲线
示例
POPBasicAnimation *anBasic = [POPBasicAnimation animationWithPropertyNamed:kPOPViewFrame];
anBasic.toValue = [NSValue valueWithCGRect:CGRectMake(100, 100, 100, 100)];
anBasic.beginTime = CACurrentMediaTime();
anBasic.duration = 0.5f; //设置时长
anBasic.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; //设置赛贝尔曲线
[self.button pop_addAnimation:anBasic forKey:@"frame"];
POPSpringAnimation
持续时长由下面的时间算出,不能设定
特有属性
@property (copy, nonatomic) id velocity; //速度 CGPoint(x速度,y速度)
@property (assign, nonatomic) CGFloat springBounciness; //弹力 越大则震动幅度越大 默认4.0f
@property (assign, nonatomic) CGFloat springSpeed; //弹簧速度 越大则动画结束越快 默认12.0f
//更细地调控动画,调试比较耗时,一般用上面三个属性就行。
@property (assign, nonatomic) CGFloat dynamicsTension; //拉力-影响回弹力度以及速度 默认11.090783f
@property (assign, nonatomic) CGFloat dynamicsFriction; // 摩擦力-如果开启,动画会不断重复,幅度逐渐削弱,直到停止。 默认342.100588f
@property (assign, nonatomic) CGFloat dynamicsMass; //质量-细微的影响动画的回弹力度以及速度 默认1.0f
示例
POPSpringAnimation * anSpring = [POPSpringAnimation animationWithPropertyNamed:kPOPViewCenter];
anSpring.toValue = [NSValue valueWithCGPoint:CGPointMake(self.button.center.x, self.button.center.y+200)];
anSpring.springSpeed = 20.0f; //设置弹簧速度
anSpring.springBounciness = 30.0f; //设置弹力
[self.button pop_addAnimation:anSpring forKey:@"center"];
POPDecayAnimation
特有属性
@property (copy, nonatomic) id velocity; //速率
@property (assign, nonatomic) CGFloat deceleration; //速度衰减速率 默认0.998 取值区间(0,1)
//但是我测试这个值deceleration越大,速度衰减速率越慢且与1-deceleration有关
示例
PopDecayAnimation *anDecay = [POPDecayAnimation animationWithPropertyNamed:kPOPLayerPositionX];
anDecay.velocity = @(50.0);
anDecay.deceleration = 0.998;//0.998动画持续1.150141s 0.999动画持续2.301434s 0.9999动画持续23.024700
[self.button pop_addAnimation:anDecay forKey:@"PositionX"];