facebook/pop框架


这几天主要研究了一下视图动画(ViewAnimation)这一块
发现网上发布的视图动画里很多都动画效果都可以通过facebook/pop框架来实现的
所以就对facebook/pop框架进行了一番学习


Facebook官方阐述:
 Pop是一个适用于iOS和OS X平台的可扩展动画引擎。除了基本的静态动画,Pop还支持spring(弹性动画)和decay(衰减动画),有助于打造一个逼真的,基于物理的交互。你可以通过Pop的API把Pop快速集成到现有的Objective-C代码库中,并在任何对象上实现动画的任何属性。这是一个成熟的并且经过良好测试的框架,承载了Paper中所有的动画和交互。



pop一共有四个大类:

POPSpringAnimation  有弹性效果的动画类(在动画效果中比较流行)
POPBasicAnimation   基本动画类
POPDecayAnimation   衰减动画类
POPCustomAnimation  可以自定义动画的类





前言:Pop框架中dispatch_once创建单列的实现
现在很多开源类的单列实现都是用dispatch_once来实现,dispatch_once使得对象只被创建一次,保证了线程安全。
看过AFNetworking框架内部实现的会发现里面的单列创建也是用dispatch_once来实现的。







1.POPSpringAnimation  有弹性效果的动画类

其中POPSpringAnimation 有几个属性是用来定义弹簧行为的,包括弹簧的反弹力度和速度

  1. springAnimation.springBounciness = 20;  //

    弹簧的反弹力度

    取值范围为[0, 20],默认值为4
  2. springAnimation.springSpeed = 20; //

    弹簧的速度速度越快,动画时间越短 [0, 20],默认为12,和springBounciness一起决定着弹簧动画的效果
  3. springAnimation.dynamicsTension = 5.0f//弹跳的剧烈度(绷紧)

  4. springAnimation.dynamicsFriction = 5.0f;//弹跳的(

    摩擦力)
  5. springAnimation.dynamicsMass = 5.0f; //
    质量
    注:
    剧烈度,摩擦力,质量这三者可以从更细的粒度上替代springBounciness和springSpeed控制弹簧动画的效果

1.>这里是创建一个_springView视图,并弹性修改视图的尺寸,使得视图有弹性的收缩(放大缩小)




2.>这里是创建一个_springView视图,并弹性修改视图的位置,使得视图有弹性的跳到指定位置(位移动画)


2.POPBasicAnimation   基本动画类

1.>这里是创建一个_baseView视图,为_baseView添加一个基本动画修改_baseView的透明度



3.POPCustomAnimation  可以自定义动画的类(可以将多种动画效果组合起来使用)

1.>这里是创建一个_popView视图,为 _popView视图添加一个弹性动画显示_popView视图,又添加一个基本动画来隐藏_popView视图




三条注意事项:
1. 当添加类似[myView pop_addAnimation:animation forKey:@"animationKey"];的动画时,如果你用相同的key添加其他动画,那么新添加的动画将会取代先前的动画。
2. 当你想要开始一个动画时,使用CACurrentMediaTime()生成一个动画开始时间来初始化beginTime。所以它看起来应该像:animation.beginTimee = CACurrentMediaTime() + delayInSeconds;.我简单地添加了delay,当然不会凑效。感谢Kimon(@kimon) 的警告。
3. 当你看到类似kPOPLayerScaleXY属性时,它将会有两个值。在这个例子中是CGSize。现在可能是有意义的,不过我传递了一个NSNumber(单一值),期待设置成X和Y值。

简单几步即可为Pop添加属性,如果有人想要贡献的话,可以:(参照以下示例为Pop添加属性
例1.>这个例子为strokeStart(属于CAShapeLayer)创建了自定义属性:
  1. [POPAnimatableProperty propertyWithName:@"strokeStart" initializer:^(POPMutableAnimatableProperty *prop) { 
  2.         prop.readBlock = ^(id obj, CGFloat values[]) { 
  3.             values[0] = [obj strokeStart]; 
  4.         }; 
  5.         prop.writeBlock = ^(id obj, const CGFloat values[]) { 
  6.             [obj setStrokeStart:values[0]]; 
  7.         }; 
  8.     }];
例2.>
  1. POPAnimatableProperty *constantProperty = [POPAnimatableProperty propertyWithName:@"constant" initializer:^(POPMutableAnimatableProperty *prop){   
  2.         prop.readBlock = ^(NSLayoutConstraint *layoutConstraint, CGFloat values[]) { 
  3.             values[0] = [layoutConstraint constant]; 
  4.         }; 
  5.         prop.writeBlock = ^(NSLayoutConstraint *layoutConstraint, const CGFloat values[]) { 
  6.             [layoutConstraint setConstant:values[0]]; 
  7.         }; 
  8.     }]; 
  9.  
  10. POPSpringAnimation *constantAnimation = [POPSpringAnimation animation];   
  11. constantAnimation.property = constantProperty;   
  12. constantAnimation.fromValue = @(_layoutConstraint.constant);   
  13. constantAnimation.toValue = @(200);   
  14. [_layoutConstraint pop_addAnimation:constantAnimation forKey:@"constantAnimation"]; 



1.把NSString和你的属性名称添加到POPAnimatableProperty.h中,遵守它的命名惯例,看起来可能像kPOP<class name witout prefix><propertyName>。如果它不止有一个值,那么它可能会像kPOP<class name witout prefix><propertyName>XY。然后在POPAnimatableProperty.m上添加实际值,它可能会是NSString * const kPop<class name witout prefix><propertyName> = @"<propertyName>"。如果你不确定如何命名,可以看看其他属性。
2.添加write/read blocks有效的方法,加上阀值。你可以看看其他属性是怎么做的
3.我不需要这么做,因为我添加的属性非常简单。当读/写新值的时候,充分利用辅助属性会好很多。比如你可以看看kPOPViewBackgroundColor是如何实现的:
  1. {kPOPViewBackgroundColor, 
  2.   ^(UIView *obj, CGFloat values[]) { 
  3.     POPUIColorGetRGBAComponents(obj.backgroundColor, values); 
  4.   }, 
  5.   ^(UIView *obj, const CGFloat values[]) { 
  6.     obj.backgroundColor = POPUIColorRGBACreate(values); 
  7.   }, 
  8.   1.0 
  9. }, 

例2.>这个例子使用了POPUIColorGetRGBAComponents和POPUIColorRGBACreate:
  
  
  1. void POPUIColorGetRGBAComponents(UIColor *color, CGFloat components[])   
  2.   return POPCGColorGetRGBAComponents(color.CGColor, components); 
  3.  
  4. UIColor *POPUIColorRGBACreate(const CGFloat components[])   
  5.   CGColorRef colorRef = POPCGColorRGBACreate(components); 
  6.   UIColor *color = [[UIColor alloc] initWithCGColor:colorRef]; 
  7.   CGColorRelease(colorRef); 
  8.   return color; 




4.Pop Animation相比于Core Animation的优点
Pop Animation在使用上和Core Animation很相似,都涉及Animation对象以及Animation的载体的概念,不同的是Core Animation的载体只能是CALayer,而Pop Animation可以是任意基于NSObject的对象。
1.>Pop Animation应用于CALayer时,在动画运行的任何时刻,layer和其presentationLayer的相关属性值始终保持一致,而Core Animation做不到。 
2.>Pop Animation可以应用任何NSObject的对象,而Core Aniamtion必须是CALayer。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值