标签:
POP简单介绍及使用
前言
动画在APP开发过程中 大家多多少少都会接触到 而且随着ios7的扁平化风格启用之后 越来越多的APP开始尝试加入各种绚丽的动画交互效果以增加APP的用户体验(当然 还是以国外的APP居多)
有过相关开发经验的同学肯定知道在iOS中 动画相关的部分都是基于Core Animation 但是今天我们不讨论Core Animation 今天的主角是POP -来自于Facebook的动画引擎(其实我不喜欢把POP定义为动画引擎 我愿意称它为函数发生器)
介绍
官方地址 https://github.com/facebook/pop
官方介绍(翻译版)
POP是一个在iOS与OS X上通用的极具扩展性的动画引擎 它在基本的静态动画的基础上增加的弹簧动画与衰减动画 使之能创造出更真实更具物理性的交互动画 POP的API可以快速的与现有的ObjC代码集成并可以作用于任意对象的任意属性
POP是个相当成熟且久经考验的框架 Facebook出品的令人惊叹的Paper应用中的所有动画和效果即出自POP
安装方式还是推荐使用CocoaPod
POP的神奇之处在于 它是独立与Core Animation的存在 所以 忘记Core Animation吧 忘记Layer Tree吧 迎接一个简单的明天 (LOL 开玩笑的~:) 很多地方还是会需要Core Animation的 不过说不定哪天苹果大发善心 将动画相关的部分向POP借鉴一点也不是不可能的(比如SpriteKit就借鉴了Cocos2D :)
使用
POP默认支持三种动画 但同时也支持自定义动画
这里我们只讨论前三种(因为自定义动画我也没用过 :) 先来看看官方的示例代码吧
官方代码示例
//Basic animations can be used to interpolate values over a specified time period. To use an ease-in ease-out animation to animate a view‘s alpha from 0.0 to 1.0 over the default duration:
1 POPBasicAnimation *anim = [POPBasicAnimation animationWithPropertyNamed:kPOPViewAlpha]; 2 anim.fromValue = @(0.0); 3 anim.toValue = @(1.0); 4 [view pop_addAnimation:anim forKey:@"fade"];
//Spring animations can be used to give objects a delightful bounce. In this example, we use a spring animation to animate a layer‘s bounds from its current value to (0, 0, 400, 400):
1 POPSpringAnimation *anim = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerBounds]; 2 anim.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 400, 400)]; 3 [layer pop_addAnimation:anim forKey:@"size"];
//Decay animations can be used to gradually slow an object to a halt. In this example, we decay a layer‘s positionX from it‘s current value and velocity 1000pts per second:
1 POPDecayAnimation *anim = [POPDecayAnimation animationWithPropertyNamed:kPOPLayerPositionX]; 2 anim.velocity = @(1000.); 3 [layer pop_addAnimation:anim forKey:@"slide"]; 4 POPBasicAnimation
POPBasicAnimation
POPBasicAnimation使用最广泛 提供固定时间间隔的动画(如淡入淡出效果)
代码示例1
1 POPBasicAnimation *anBasic = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerPositionX]; 2 anBasic.toValue = @(self.square.center.y+300); 3 anBasic.beginTime = CACurrentMediaTime() + 1.0f; 4 [self.square pop_addAnimation:anBasic forKey:@"position"]; 5 其动画效果如下 6 POPBasicAnimationPOPBasicAnimation
可以看到 添加一个动画最少仅需三步
POPBasicAnimation可配置的属性与默认值为
POPBasicAnimation提供四种timingfunction(很熟悉 对不对? 就是Core Animation中那些)
其时间函数分别如下
POPSpringAnimation
POPSpringAnimation也许是大多数人使用POP的理由 其提供一个类似弹簧一般的动画效果(使用后 APP立马就活泼起来了 有木有?!)
代码示例23
1 POPSpringAnimation *anSpring = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerPositionX]; 2 anSpring.toValue = @(self.square.center.y+300); 3 anSpring.beginTime = CACurrentMediaTime() + 1.0f; 4 anSpring.springBounciness = 10.0f; 5 [self.square pop_addAnimation:anSpring forKey:@"position"];
POPSpringAnimation可配置的属性与默认值为
注意:POPSpringAnimation是没有duration字段的 其动画持续时间由以上几个参数决定
POPDecayAnimation
POPDecayAnimation提供一个过阻尼效果(其实Spring是一种欠阻尼效果) 可以实现类似UIScrollView的滑动衰减效果(是的 你可以靠它来自己实现一个UIScrollView)
代码示例3
1 POPDecayAnimation *anDecay = [POPDecayAnimation animationWithPropertyNamed:kPOPLayerPositionX]; 2 anDecay.velocity = @(600); 3 anDecay.beginTime = CACurrentMediaTime() + 1.0f; 4 [self.square pop_addAnimation:anDecay forKey:@"position"];
注意:这里对POPDecayAnimation设置toValue是没有意义的 会被忽略(因为目的状态是动态计算得到的)
POPDecayAnimation可配置的属性与默认值为
注意:POPDecayAnimation也是没有duration字段的 其动画持续时间由velocity与deceleration决定
接下来我们看一下POP默认支持哪些属性的动画 打开POPAnimatablePropery.h可以看到如下定义(这些是到目前为止 所支持的属性 随着版本的更新 还在不断的新增中 :)
1 /** 2 Common CALayer property names. 3 */ 4 extern NSString * const kPOPLayerBackgroundColor; 5 extern NSString * const kPOPLayerBounds; 6 extern NSString * const kPOPLayerCornerRadius; 7 extern NSString * const kPOPLayerBorderWidth; 8 extern NSString * const kPOPLayerBorderColor; 9 extern NSString * const kPOPLayerOpacity; 10 extern NSString * const kPOPLayerPosition; 11 extern NSString * const kPOPLayerPositionX; 12 extern NSString * const kPOPLayerPositionY; 13 extern NSString * const kPOPLayerRotation; 14 extern NSString * const kPOPLayerRotationX; 15 extern NSString * const kPOPLayerRotationY; 16 extern NSString * const kPOPLayerScaleX; 17 extern NSString * const kPOPLayerScaleXY; 18 extern NSString * const kPOPLayerScaleY; 19 extern NSString * const kPOPLayerSize; 20 extern NSString * const kPOPLayerSubscaleXY; 21 extern NSString * const kPOPLayerSubtranslationX; 22 extern NSString * const kPOPLayerSubtranslationXY; 23 extern NSString * const kPOPLayerSubtranslationY; 24 extern NSString * const kPOPLayerSubtranslationZ; 25 extern NSString * const kPOPLayerTranslationX; 26 extern NSString * const kPOPLayerTranslationXY; 27 extern NSString * const kPOPLayerTranslationY; 28 extern NSString * const kPOPLayerTranslationZ; 29 extern NSString * const kPOPLayerZPosition; 30 extern NSString * const kPOPLayerShadowColor; 31 extern NSString * const kPOPLayerShadowOffset; 32 extern NSString * const kPOPLayerShadowOpacity; 33 extern NSString * const kPOPLayerShadowRadius; 34 35 /** 36 Common CAShapeLayer property names. 37 */ 38 extern NSString * const kPOPShapeLayerStrokeStart; 39 extern NSString * const kPOPShapeLayerStrokeEnd; 40 extern NSString * const kPOPShapeLayerStrokeColor; 41 extern NSString * const kPOPShapeLayerFillColor; 42 43 /** 44 Common NSLayoutConstraint property names. 45 */ 46 extern NSString * const kPOPLayoutConstraintConstant; 47 48 49 #if TARGET_OS_IPHONE 50 51 /** 52 Common UIView property names. 53 */ 54 extern NSString * const kPOPViewAlpha; 55 extern NSString * const kPOPViewBackgroundColor; 56 extern NSString * const kPOPViewBounds; 57 extern NSString * const kPOPViewCenter; 58 extern NSString * const kPOPViewFrame; 59 extern NSString * const kPOPViewScaleX; 60 extern NSString * const kPOPViewScaleXY; 61 extern NSString * const kPOPViewScaleY; 62 extern NSString * const kPOPViewSize; 63 extern NSString * const kPOPViewTintColor; 64 65 /** 66 Common UIScrollView property names. 67 */ 68 extern NSString * const kPOPScrollViewContentOffset; 69 extern NSString * const kPOPScrollViewContentSize; 70 extern NSString * const kPOPScrollViewZoomScale; 71 extern NSString * const kPOPScrollViewContentInset; 72 73 /** 74 Common UITableView property names. 75 */ 76 extern NSString * const kPOPTableViewContentOffset; 77 extern NSString * const kPOPTableViewContentSize; 78 79 /** 80 Common UICollectionView property names. 81 */ 82 extern NSString * const kPOPCollectionViewContentOffset; 83 extern NSString * const kPOPCollectionViewContentSize; 84 85 /** 86 Common UINavigationBar property names. 87 */ 88 extern NSString * const kPOPNavigationBarBarTintColor; 89 90 /** 91 Common UIToolbar property names. 92 */ 93 extern NSString * const kPOPToolbarBarTintColor; 94 95 /** 96 Common UITabBar property names. 97 */ 98 extern NSString * const kPOPTabBarBarTintColor; 99 100 /** 101 Common UILabel property names. 102 */ 103 extern NSString * const kPOPLabelTextColor;
作为刚接触POP的一些同学来说 如果在上面看到你希望的某些属性的话 你可以像官方代码示例一样指定这个属性即可开始动画了
但是如果你想要的某些属性不在之上呢 这时候自定义属性POPAnimatableProperty就排上用场了
自定义属性
POP默认支持的三种动画都继承自POPPropertyAnimation POPPropertyAnimation中定义了一个叫property的属性( 之前没有用到它是因为POP根据不同的默认动画属性帮你生成了默认的property) 而这个property则是用来驱动POP的动画效果中的重要一环
代码示例4
1 POPAnimatableProperty *prop = [POPAnimatableProperty propertyWithName:@"prop" initializer:^(POPMutableAnimatableProperty *prop) { 2 // read value 3 prop.readBlock = ^(id obj, CGFloat values[]) { 4 5 }; 6 // write value 7 prop.writeBlock = ^(id obj, const CGFloat values[]) { 8 9 }; 10 // dynamics threshold 11 prop.threshold = 0.01; 12 }];
其组成就是一个readBlock一个writeBlock和一个threashold
还是以一个实际的例子来说明如何使用自定义属性 比如我们要实现一个像系统的时钟APP里秒表计时的一个效果
1 POPAnimatableProperty *prop = [POPAnimatableProperty propertyWithName:@"countdown" initializer:^(POPMutableAnimatableProperty *prop) { 2 3 prop.writeBlock = ^(id obj, const CGFloat values[]) { 4 UILabel *lable = (UILabel*)obj; 5 label.text = [NSString stringWithFormat:@"%02d:%02d:%02d",(int)values[0]/60,(int)values[0]%60,(int)(values[0]*100)%100]; 6 }; 7 8 // prop.threshold = 0.01f; 9 }]; 10 11 POPBasicAnimation *anBasic = [POPBasicAnimation linearAnimation]; //秒表当然必须是线性的时间函数 12 anBasic.property = prop; //自定义属性 13 anBasic.fromValue = @(0); //从0开始 14 anBasic.toValue = @(3*60); //180秒 15 anBasic.duration = 3*60; //持续3分钟 16 anBasic.beginTime = CACurrentMediaTime() + 1.0f; //延迟1秒开始 17 [label pop_addAnimation:anBasic forKey:@"countdown"];
有没有从中得到一些启发呢? POP可以做的事情可远比Core Animation要多(注意这里我们使用了beginTime这个属性来设置动画的延迟施放) 例如音乐播放时那种淡入淡出的效果等等也可以用POP来实现
小结
其实只需要熟练掌握POP自带的三种动画 即可完成大部分的动画效果 如果实在是无法满足你的需求的话 自定义动画也基本可以满足你的要求 可以说POP化繁为简的出现 极大的方便了我们这些苦逼的coder
当然 就像我说的 POP不仅仅是一个动画引擎 相信经过我最后一个例子 大家可以得到一点启事 POP能做的事情还不少 :)
标签:
原文地址:http://www.cnblogs.com/iCocos/p/4796186.html