pop

作者: 暖光照 | 来源:发表于2016-10-31 22:30 被阅读188次

    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"];

    相关文章

      网友评论

        本文标题:pop

        本文链接:https://www.haomeiwen.com/subject/vlqputtx.html