简介

Pop 是一个可扩展的动画引擎,可用于实现任意iOS对象的任意属性的动态变化,支持一般动画,弹性动画和渐变动画三种类型.

  • 项目主页: pop

  • 最新示例: 点击下载

  • 注意: 官方代码中,并不包含实例,而是用于编译的所有源代码,建议自行新建工程,并结合下文的代码片段查看效果.

入门

安装

通过CocoaPods安装

  1. pod 'pop', '~> 1.0'

使用

在需要使用POP的地方,引入头文件:

  1. #import <pop/POP.h>

动画的开始,停止 与 更新

把动画添加到你想要拥有动态变化的对象上面,即可开始动画:

  1. POPSpringAnimation *anim = [POPSpringAnimation animation];
  2. ...
  3. [layer pop_addAnimation:anim forKey:@"myKey"];

可以根据开始动画时传入的键,来移除对应的动画:

  1. [layer pop_removeAnimationForKey:@"myKey"];

开始动画时传入的键,也可以用来查询是否存在某个动画.更新一个正在执行的动画的 toValue,可以无缝实现动画效果间的过渡:

  1. anim = [layer pop_animationForKey:@"myKey"];
  2. if (anim) {
  3. /* 更新toValue为一个新值. */
  4. anim.toValue = @(42.0);
  5. } else {
  6. /* 创建并开始一个新的动画. */
  7. ....
  8. }

上面的例子是以图层为例.Pop是以NSObject的扩展方式实现的.也就是说: 任何NSObject及其子类都可以通过Pop添加动画效果.

动画类型

有四种动画类型: 弹性动画,渐弱动画,基础动画和自定义动画.

弹性动画

弹性动画,可以给对象一个有活力的弹跳效果.下面的例子中,我们使用弹性动画来使图层的边框值从它的当前值变化为(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"];

渐变动画

渐变动画,可以让对象缓慢地停止变化.下面的例子,我们使图层的横坐标从当前值以1000像素每秒的速度渐变:

  1. POPDecayAnimation *anim = [POPDecayAnimation animationWithPropertyNamed:kPOPLayerPositionX];
  2. anim.velocity = @(1000.);
  3. [layer pop_addAnimation:anim forKey:@"slide"];

基础动画

基础动画可以用来在指定的时间段动态改变属性的值.在默认的时间周期内动态让视图的透明度从0.0变化到1.0来实现淡入的效果:

  1. POPBasicAnimation *anim = [POPBasicAnimation animationWithPropertyNamed:kPOPViewAlpha];
  2. anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
  3. anim.fromValue = @(0.0);
  4. anim.toValue = @(1.0);
  5. [view pop_addAnimation:anim forKey:@"fade"];

自定义动画

POPCustomAnimation 用来创建自定义动画和过渡效果.它通过管理 CADisplayLink 来管理时间与动画的关联性.更多细节,详见头文件.

动画属性

动画属性由POPAnimatableProperty类管理,用来指定在哪个属性上应用动画效果.在下面的例子中,我们创建了一个弹性动画,并且显示设置动画属性为与-[CALayer bounds]对应的属性:

  1. POPSpringAnimation *anim = [POPSpringAnimation animation];
  2. anim.property = [POPAnimatableProperty propertyWithName:kPOPLayerBounds];

这个框架爱预先实现了了许多图层和视图共用的动画属性,你可以在自己的项目中直接使用.你也可以通过创建POPAnimatableProperty类的实例,来创建一个自定义的动画属性.下面的例子中,我们定义了一个自定义的volume动画属性:

  1. prop = [POPAnimatableProperty propertyWithName:@"com.foo.radio.volume" initializer:^(POPMutableAnimatableProperty *prop) {
  2. // 读取动画属性的值
  3. prop.readBlock = ^(id obj, CGFloat values[]) {
  4. values[0] = [obj volume];
  5. };
  6. // 设置动画属性的值.
  7. prop.writeBlock = ^(id obj, const CGFloat values[]) {
  8. [obj setVolume:values[0]];
  9. };
  10. // 力学上的临界值
  11. prop.threshold = 0.01;
  12. }];
  13. anim.property = prop;

系统预定义的动画属性也是由上面例子的机制定义的,自定义动画属性时,很有借鉴价值.完整的预定义的动画属性列表和他们实现的具体细节参见POPAnimatableProperty.h:

  1. /**
  2. 图层(CALayer)通用动画属性.
  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. 图形层(CAShapeLayer)通用动画属性.
  36. */
  37. extern NSString * const kPOPShapeLayerStrokeStart;
  38. extern NSString * const kPOPShapeLayerStrokeEnd;
  39. extern NSString * const kPOPShapeLayerStrokeColor;
  40. extern NSString * const kPOPShapeLayerFillColor;
  41. /**
  42. 视图约束(NSLayoutConstraint)通用动画属性.
  43. */
  44. extern NSString * const kPOPLayoutConstraintConstant;
  45. /**
  46. 视图(UIView)通用动画属性.
  47. */
  48. extern NSString * const kPOPViewAlpha;
  49. extern NSString * const kPOPViewBackgroundColor;
  50. extern NSString * const kPOPViewBounds;
  51. extern NSString * const kPOPViewCenter;
  52. extern NSString * const kPOPViewFrame;
  53. extern NSString * const kPOPViewScaleX;
  54. extern NSString * const kPOPViewScaleXY;
  55. extern NSString * const kPOPViewScaleY;
  56. extern NSString * const kPOPViewSize;
  57. extern NSString * const kPOPViewTintColor;
  58. /**
  59. 滚动视图(UIScrollView)通用动画属性.
  60. */
  61. extern NSString * const kPOPScrollViewContentOffset;
  62. extern NSString * const kPOPScrollViewContentSize;
  63. extern NSString * const kPOPScrollViewZoomScale;
  64. extern NSString * const kPOPScrollViewContentInset;
  65. /**
  66. 列表(UITableView)通用动画属性.
  67. */
  68. extern NSString * const kPOPTableViewContentOffset;
  69. extern NSString * const kPOPTableViewContentSize;
  70. /**
  71. 集合视图(UICollectionView)通用动画属性.
  72. */
  73. extern NSString * const kPOPCollectionViewContentOffset;
  74. extern NSString * const kPOPCollectionViewContentSize;
  75. /**
  76. 导航栏(UINavigationBar)通用动画属性.
  77. */
  78. extern NSString * const kPOPNavigationBarBarTintColor;
  79. /**
  80. 工具栏(UIToolBar)通用动画属性.
  81. */
  82. extern NSString * const kPOPToolbarBarTintColor;
  83. /**
  84. 标签栏(UITabBar)通用动画属性.
  85. */
  86. extern NSString * const kPOPTabBarBarTintColor;
  87. /**
  88. 标签(UILabel)通用动画属性.
  89. */
  90. extern NSString * const kPOPLabelTextColor;

Pop–实现任意iOS对象的任意属性的动态变化的更多相关文章

  1. DataTable转任意类型对象List数组-----工具通用类(利用反射和泛型)

    public class ConvertHelper<T> where T : new() { /// <summary> /// 利用反射和泛型 /// </summa ...

  2. js 获取任意一个元素的任意一个样式属性的值

    //谷歌,火狐支持console.log(window.getComputedStyle(my$("dv"),null).left);//IE8支持console.log(my$( ...

  3. iOS对象属性详解

    oc对象的一些属性: retain,strong, copy,weak,assign,readonly, readwrite, unsafe_unretained 下面来分别讲讲各自的作用和区别: r ...

  4. iOS-runtime-根据类名推送到任意控制器,且实现属性传值

    // // WJRuntime.m // RuntimeSkip // // Created by tqh on 15/9/8. // Copyright (c) 2015年 tqh. All rig ...

  5. JavaScript---网络编程(3)-Object、String、Array对象和prototype属性

    本节学习JavaScript的对象和方法(函数)~ Object 对象 提供所有 JScript 对象通用的功能. obj = new Object([value]) 参数 obj 必选项.要赋值为 ...

  6. JavaScript中内置对象的一些属性及方法

    Javascript对象总结 JS中内置了17个对象,常用的是Array对象.Date对象.正则表达式对象.string对象.Global对象 Array对象中常用方法: Concat():表示把几个 ...

  7. Vue (二) --- Vue对象提供的属性功能

    --------------------------------------------不是井里没有水,而是你挖的不够深. 3. Vue对象提供的属性功能 3.1 过滤器 过滤器,就是vue允许开发者 ...

  8. JSON字符串反序列化成对象_部分属性值反序列化失败

    简介:本人在开发webapi接口时遇到了:一个复杂的Json字符串在反序列化为对象时报,无法发序列化其中的一个属性对象? 使用方法: InternalRecommendRequestFormModel ...

  9. vue 对象提供的属性功能、通过axio请求数据(2)

    1 Vue对象提供的属性功能 1.1 过滤器 过滤器,就是vue允许开发者自定义的文本格式化函数,可以使用在两个地方:输出内容和操作数据中. 1.1.1 使用Vue.filter()进行全局定义(全局 ...

随机推荐

  1. Animation 把动画片段拖入Animation组件里后不能播放

    1. 选中动画片段,点击右上角三道横杠那个按钮,选择Debug: 2.选择Legacy,然后再点击那个三道横岗的按钮,选择Normal就可以用了应该.

  2. Java学生管理系统(连接数据库查询)超详细

    这几天逼着交Java,借鉴各位师傅的做出来这么个简陋的东西,各位大师傅不要笑我.(学都没有学过Java的我,QAQ~) 下面针对的都是SQL Server系列的连接,如果你使用MySQL那么不必看关于 ...

  3. 牛客网Java刷题知识点之代码块(局部代码快、构造代码块、静态代码块)

    不多说,直接上干货! 代码块包括局部代码快.构造代码块.静态代码块. 代码块,就是一段独立的代码空间. 1.局部代码快 对局部变量的生命周期进行控制. 2.构造代码块 对所有对象进行初始化. 3.静态 ...

  4. Linux禁ping

    A.临时允许PING操作的命令为:# >/proc/sys/net/ipv4/icmp_echo_ignore_all B.永久允许PING配置方法. /etc/sysctl.conf 中增加一 ...

  5. 切图技巧——PS篇

    1.选框工具这里可以选择增加选区.减少选区 ==> 2.存储为web格式 1)JPG:一般用于大图 2)gif:可作动图,与png-8基本一样,不支持半透明 3)png-8:不支持动图,不支持半 ...

  6. java实现新旧版本号比较

    项目中需要使用比较现在线上版本和新版本,然后新版本执行新方法,方法如下: /** * * @方法名称:comparaVersion * @内容摘要: <版本比较> * @param old ...

  7. Spring-cloud微服务 Eureka学习教程-分布式搭建EurekaServer、EurekaClient+Ribbon(中级)

    我们这里只有一台服务器,所以我们先仿集群搭建. 完整demo项目代码:https://github.com/wades2/EurekaDemo2 在这之前我们先分析分析Eureka相比其他注册中心的好 ...

  8. svg保存为图片下载到本地

    今天给大家说一个将svg下载到本地图片的方法,这里我不得不吐槽一下,为啥博客园不可以直接上传本地文件给大家用来直接下载分享呢,好,吐槽到此为止! 这里需要用到一个js文件,名字自己起,内容如下: (f ...

  9. AOSP 源码下载

    网上关于这块大部分教程都是无效的,因为墙的缘故,无法使用官方提供的下载链接,我这里使用了清华大学的镜像,是能够顺利将 AOSP 下载下来.如果你还没有安装 Ubuntu,请看<VirtualBo ...

  10. Struts2_用ModelDriven接收参数

    通过实现 ModelDriven 接口来接收请求参数,这种方法用的比较少,一般还是用前两种. 请求: <a href="user/user!add?name=xiaoer&ag ...