Pop–实现任意iOS对象的任意属性的动态变化

简介

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

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

入门

安装

通过CocoaPods安装

pod ‘pop‘, ‘~> 1.0‘

使用

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

#import <pop/POP.h>

动画的开始,停止 与 更新

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

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

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

[layer pop_removeAnimationForKey:@"myKey"];

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

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

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

动画类型

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

弹性动画

弹性动画,可以给对象一个有活力的弹跳效果.下面的例子中,我们使用弹性动画来使图层的边框值从它的当前值变化为(0, 0 ,400, 400):

POPSpringAnimation *anim = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerBounds];
anim.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 400, 400)];
[layer pop_addAnimation:anim forKey:@"size"];

渐变动画

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

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

基础动画

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

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

自定义动画

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

动画属性

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

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

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

prop = [POPAnimatableProperty propertyWithName:@"com.foo.radio.volume" initializer:^(POPMutableAnimatableProperty *prop) {
  // 读取动画属性的值
  prop.readBlock = ^(id obj, CGFloat values[]) {
    values[0] = [obj volume];
  };
  // 设置动画属性的值.
  prop.writeBlock = ^(id obj, const CGFloat values[]) {
    [obj setVolume:values[0]];
  };
  // 力学上的临界值
  prop.threshold = 0.01;
}];

anim.property = prop;

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

/**
 图层(CALayer)通用动画属性.
 */
extern NSString * const kPOPLayerBackgroundColor;
extern NSString * const kPOPLayerBounds;
extern NSString * const kPOPLayerCornerRadius;
extern NSString * const kPOPLayerBorderWidth;
extern NSString * const kPOPLayerBorderColor;
extern NSString * const kPOPLayerOpacity;
extern NSString * const kPOPLayerPosition;
extern NSString * const kPOPLayerPositionX;
extern NSString * const kPOPLayerPositionY;
extern NSString * const kPOPLayerRotation;
extern NSString * const kPOPLayerRotationX;
extern NSString * const kPOPLayerRotationY;
extern NSString * const kPOPLayerScaleX;
extern NSString * const kPOPLayerScaleXY;
extern NSString * const kPOPLayerScaleY;
extern NSString * const kPOPLayerSize;
extern NSString * const kPOPLayerSubscaleXY;
extern NSString * const kPOPLayerSubtranslationX;
extern NSString * const kPOPLayerSubtranslationXY;
extern NSString * const kPOPLayerSubtranslationY;
extern NSString * const kPOPLayerSubtranslationZ;
extern NSString * const kPOPLayerTranslationX;
extern NSString * const kPOPLayerTranslationXY;
extern NSString * const kPOPLayerTranslationY;
extern NSString * const kPOPLayerTranslationZ;
extern NSString * const kPOPLayerZPosition;
extern NSString * const kPOPLayerShadowColor;
extern NSString * const kPOPLayerShadowOffset;
extern NSString * const kPOPLayerShadowOpacity;
extern NSString * const kPOPLayerShadowRadius;

/**
 图形层(CAShapeLayer)通用动画属性.
  */
extern NSString * const kPOPShapeLayerStrokeStart;
extern NSString * const kPOPShapeLayerStrokeEnd;
extern NSString * const kPOPShapeLayerStrokeColor;
extern NSString * const kPOPShapeLayerFillColor;

/**
 视图约束(NSLayoutConstraint)通用动画属性.
  */
extern NSString * const kPOPLayoutConstraintConstant;

/**
 视图(UIView)通用动画属性.
 */
extern NSString * const kPOPViewAlpha;
extern NSString * const kPOPViewBackgroundColor;
extern NSString * const kPOPViewBounds;
extern NSString * const kPOPViewCenter;
extern NSString * const kPOPViewFrame;
extern NSString * const kPOPViewScaleX;
extern NSString * const kPOPViewScaleXY;
extern NSString * const kPOPViewScaleY;
extern NSString * const kPOPViewSize;
extern NSString * const kPOPViewTintColor;

/**
 滚动视图(UIScrollView)通用动画属性.
 */
extern NSString * const kPOPScrollViewContentOffset;
extern NSString * const kPOPScrollViewContentSize;
extern NSString * const kPOPScrollViewZoomScale;
extern NSString * const kPOPScrollViewContentInset;

/**
 列表(UITableView)通用动画属性.
 */
extern NSString * const kPOPTableViewContentOffset;
extern NSString * const kPOPTableViewContentSize;

/**
 集合视图(UICollectionView)通用动画属性.
 */
extern NSString * const kPOPCollectionViewContentOffset;
extern NSString * const kPOPCollectionViewContentSize;

/**
 导航栏(UINavigationBar)通用动画属性.
 */
extern NSString * const kPOPNavigationBarBarTintColor;

/**
 工具栏(UIToolBar)通用动画属性.
 */
extern NSString * const kPOPToolbarBarTintColor;

/**
 标签栏(UITabBar)通用动画属性.
 */
extern NSString * const kPOPTabBarBarTintColor;

/**
 标签(UILabel)通用动画属性.
 */
extern NSString * const kPOPLabelTextColor;
时间: 2024-10-10 21:38:50

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

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

public class ConvertHelper<T> where T : new() { /// <summary> /// 利用反射和泛型 /// </summary> /// <param name="dt"></param> /// <returns></returns> public static List<T> ConvertToList(DataTable dt) { //

unity3D 搞定任意ios插件

原地址:http://www.cnblogs.com/U-tansuo/archive/2012/11/22/unity_ios-plugin.html 说起unity调ios插件,好多淫比较头痛,探索再此给大家献上通用手册. 首先:需要需要一些OC知识,在OC中所有的界面都是基于View显示的,而要使用第三方提供的ios sdk  仅需简单修改源代码,把相应view添加到unity  build出来的xcode工程的根view上即可.也许有人在骂,这不废话,跟没说一样,我坦然接受,因为确实没有

解决javaassist 出现的类没找到异常ClassNotFoundException,获取工程下任意class对象

项目中要对工程下任意class文件进行解析,但是使用javaassist中经常出现类没找到异常.当然最主要的还是ClassPool()没找到这东西,而搜索范围是整个项目的class, 所以就做了一个处理,通过,项目下的classpath这个文件,获取所有jar路径在,再通过文件递归搜索获取所有java编译后的class文件路径,将所有路径都添加到对象池中.当然这一步是很费时的,所以最好只初始化一次. /*** * * 静态存储 */ private static ClassPool pool;

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

<input type="button" value="显示效果" id="btn"/><div id="dv"></div><script src="common.js"></script><script>// my$("btn").onclick=function () {// //获取元素距离左边位置的值//

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

// // WJRuntime.m // RuntimeSkip // // Created by tqh on 15/9/8. // Copyright (c) 2015年 tqh. All rights reserved. // #import "WJRuntime.h" #import <objc/runtime.h> @implementation WJRuntime //runtime跳转 + (void)runtimePush:(NSString *)vcNam

iOS对象属性详解

oc对象的一些属性: retain,strong, copy,weak,assign,readonly, readwrite, unsafe_unretained 下面来分别讲讲各自的作用和区别: retain,计数器加1, (增加一个指向内存的指针) 对应release(计数器-1) setter 方法对参数进行 release 旧值再 retain 新值,所有实现都是这个顺序 - (void)setBackView:(UIView *)backView { if (_backView !=

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

Javascript对象总结 JS中内置了17个对象,常用的是Array对象.Date对象.正则表达式对象.string对象.Global对象 Array对象中常用方法: Concat():表示把几个数组合并成一个数组. Join():返回字符串值,其中包含了连接到一起的数组的所有元素,元素由指定的分隔符分隔开来. Pop():移除数组最后一个元素. Shift():移除数组中第一个元素. unshift():在数组的第一项Slice(start,end):返回数组中的一段. Push():往数

window对象的常用属性,常用方法

window对象的常用属性: window.self 返回当前窗口的引用 window.parent   返回当前窗体的父窗体对象 window.top 返回当前窗体最顶层的父窗体的引用 window.outerwidth       返回当前窗口的外部宽 window.outerheight  返回当前窗口的外部高 window.innerwidth       返回当前窗口的可显示区域宽 window.innerheight  返回当前窗口的可显示区域高 提示:通过直接在Chrome控制台中

iOS基础知识之属性及属性关键字

iOS属性及属性关键字 一.属性功能:1.给现有的成员变量生成一对setter/getter方法.2.如果没有声明成员变量,自动声明一个_属性名的私有变量(默认的成员变量是受保护的). 二.属性关键字:assign 默认(缺省)关键字,基本数据类型的赋值.MRC:手动管理内存retain 对象的属性声明,保存引用计数,如果别的对象使用当前对象,则该对象的计数器加1,即两个对象同时指向同一块内存.copy 对象的属性声明,直接拷贝对象为一个新的副本,而被拷贝的对象的计数器不会加1,即两个对象分别指