这几天主要研究了一下视图动画(ViewAnimation)这一块
发现网上发布的视图动画里很多都动画效果都可以通过facebook/pop框架来实现的
所以就对facebook/pop框架进行了一番学习
Facebook官方阐述:
Pop是一个适用于iOS和OS X平台的可扩展动画引擎。除了基本的静态动画,Pop还支持spring(弹性动画)和decay(衰减动画),有助于打造一个逼真的,基于物理的交互。你可以通过Pop的API把Pop快速集成到现有的Objective-C代码库中,并在任何对象上实现动画的任何属性。这是一个成熟的并且经过良好测试的框架,承载了Paper中所有的动画和交互。
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 有几个属性是用来定义弹簧行为的,包括弹簧的反弹力度和速度
- springAnimation.springBounciness = 20; //
弹簧的反弹力度
取值范围为[0, 20],默认值为4 - springAnimation.springSpeed = 20; // 弹簧的速度速度越快,动画时间越短 [0, 20],默认为12,和springBounciness一起决定着弹簧动画的效果
-
springAnimation.dynamicsTension = 5.0f; //弹跳的剧烈度(绷紧)
-
springAnimation.dynamicsFriction = 5.0f;//弹跳的(
摩擦力) -
springAnimation.dynamicsMass = 5.0f; //注:质量剧烈度,摩擦力,质量这三者可以从更细的粒度上替代springBounciness和springSpeed控制弹簧动画的效果
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)创建了自定义属性:
- [POPAnimatableProperty propertyWithName:@"strokeStart" initializer:^(POPMutableAnimatableProperty *prop) {
- prop.readBlock = ^(id obj, CGFloat values[]) {
- values[0] = [obj strokeStart];
- };
- prop.writeBlock = ^(id obj, const CGFloat values[]) {
- [obj setStrokeStart:values[0]];
- };
- }];
例2.>
- POPAnimatableProperty *constantProperty = [POPAnimatableProperty propertyWithName:@"constant" initializer:^(POPMutableAnimatableProperty *prop){
- prop.readBlock = ^(NSLayoutConstraint *layoutConstraint, CGFloat values[]) {
- values[0] = [layoutConstraint constant];
- };
- prop.writeBlock = ^(NSLayoutConstraint *layoutConstraint, const CGFloat values[]) {
- [layoutConstraint setConstant:values[0]];
- };
- }];
- POPSpringAnimation *constantAnimation = [POPSpringAnimation animation];
- constantAnimation.property = constantProperty;
- constantAnimation.fromValue = @(_layoutConstraint.constant);
- constantAnimation.toValue = @(200);
- [_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是如何实现的:
- {kPOPViewBackgroundColor,
- ^(UIView *obj, CGFloat values[]) {
- POPUIColorGetRGBAComponents(obj.backgroundColor, values);
- },
- ^(UIView *obj, const CGFloat values[]) {
- obj.backgroundColor = POPUIColorRGBACreate(values);
- },
- 1.0
- },
例2.>这个例子使用了POPUIColorGetRGBAComponents和POPUIColorRGBACreate:
- void POPUIColorGetRGBAComponents(UIColor *color, CGFloat components[])
- {
- return POPCGColorGetRGBAComponents(color.CGColor, components);
- }
- UIColor *POPUIColorRGBACreate(const CGFloat components[])
- {
- CGColorRef colorRef = POPCGColorRGBACreate(components);
- UIColor *color = [[UIColor alloc] initWithCGColor:colorRef];
- CGColorRelease(colorRef);
- 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。