Pop 是一个可用于 iOS 和 OS X 的可扩展动画引擎。它不仅支持基本的静态动画,还支持弹簧和衰减动态动画,这使得它非常适合构建基于物理的真实交互。该 API 允许快速集成到现有的 Objective-C 代码库中,并允许对任何对象的任何属性进行动画处理。它是一个成熟且经过充分测试的框架,负责驱动 Paper 中的所有动画和过渡。
Pop 可在 CocoaPods 上找到。只需将以下内容添加到您的项目 Podfile 中
pod 'pop', '~> 1.0'
首先在 master 分支上修复错误,然后将修复内容通过指定的版本发布。如果您倾向于使用最新版本,您可以使用以下 Podfile 条目使用 master 分支的 Pop
pod 'pop', :git => 'https://github.com/facebook/pop.git'
通过将项目添加到您的项目并添加 pop.embedded framework 到应用目标的“通用”标签下的“嵌入的二元文件”部分,您可以在几秒钟内设置 pop!这也启用了使用头文件模块的 @import pop
语法。
注意:由于 Xcode 的一些限制性的问题,嵌入的静态库必须与模块具有相同的名称,并且必须具有 .framework
扩展名。这意味着在添加嵌入的静态库时,您将看到两个 pop.framework(一个是 OS X 版,另一个是 iOS 版)。您需要确保添加 iOS 版本,由于列表是按照目标顺序填充的,所以可以假定它是第二个。您可以通过检查框架旁边的路径来验证是否选择了正确的版本:Debug-iphoneos
。
注意 2:此方法目前与工作区不兼容。由于某些未知原因,当 pop.xcodeproj 位于工作区时,Xcode 简单地拒绝将 pop.framework 添加为嵌入的静态库。此方法仅在将 pop.xcodeproj 添加为当前目标项目的子项目时有效。
或者,您可以添加项目到您的 workspace 并采用提供的配置文件,或者手动将 pop 子目录下的文件复制到您的项目中。如果手动安装,请确保通过在项目链接器标志中包含 -lc++
来链接 C++ 标准库。
Pop 采用 Core Animation 显式动画编程模型。通过包含以下导入来使用它
#import <pop/POP.h>
或者如果您使用的是嵌入式框架
@import pop;
要开始动画,请将其添加到要动画化的对象中
POPSpringAnimation *anim = [POPSpringAnimation animation];
...
[layer pop_addAnimation:anim forKey:@"myKey"];
要停止动画,请将其从对象中移除,该对象引用了开始时指定的密钥
[layer pop_removeAnimationForKey:@"myKey"];
密钥也可以用来查询动画的存在。更新运行中的动画的toValue可以提供最平滑的转向方式
anim = [layer pop_animationForKey:@"myKey"];
if (anim) {
/* update to value to new destination */
anim.toValue = @(42.0);
} else {
/* create and start a new animation */
....
}
虽然上面的示例中使用了图层,但Pop接口作为NSObject的类别附加实现。任何NSObject或其子类都可以进行动画
有四种具体的动画类型:弹簧、衰减、基本和自定义
弹簧动画可以用来给对象带来愉快的弹跳效果。在这个示例中,我们使用弹簧动画来动画化一个层的大小从当前值到(0, 0, 400, 400)
POPSpringAnimation *anim = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerBounds];
anim.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 400, 400)];
[layer pop_addAnimation:anim forKey:@"size"];
衰减动画可以用来逐渐减慢对象的运动速度直至停止。在这个示例中,我们从层的位置X的当前值和速度1000pts/秒开始衰减
POPDecayAnimation *anim = [POPDecayAnimation animationWithPropertyNamed:kPOPLayerPositionX];
anim.velocity = @(1000.);
[layer pop_addAnimation:anim forKey:@"slide"];
基本动画可以用来在指定的时间段内插值值。可以通过使用ease-in ease-out动画,在默认的持续时间内动画化视图的alpha值从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
类指定的动画属性为animated。在这个示例中,我们创建了一个弹簧动画并显式地设置了对应于-[CALayer bounds]
的动画属性
POPSpringAnimation *anim = [POPSpringAnimation animation];
anim.property = [POPAnimatableProperty propertyWithName:kPOPLayerBounds];
该框架提供了许多常用的层和视图动画属性。您可以通过创建该类的新实例来动画化自定义属性。在这个示例中,我们声明了一个自定义的音量属性
prop = [POPAnimatableProperty propertyWithName:@"com.foo.radio.volume" initializer:^(POPMutableAnimatableProperty *prop) {
// read value
prop.readBlock = ^(id obj, CGFloat values[]) {
values[0] = [obj volume];
};
// write value
prop.writeBlock = ^(id obj, const CGFloat values[]) {
[obj setVolume:values[0]];
};
// dynamics threshold
prop.threshold = 0.01;
}];
anim.property = prop;
有关提供的所有可动画化属性的完整列表以及有关声明自定义属性的更多信息,请参阅POPAnimatableProperty.h
。
以下是一些调试时的提示。Pop遵循模拟器的切换慢动画设置。您可以通过启用它来减慢动画速度,并更轻松地观察交互
考虑命名您的动画。这将使您在引用它们时更容易识别,无论是通过日志还是调试器
anim.name = @"springOpen";
每个动画都附带一个相关的追踪器。追踪器允许您以快而有效的方式记录所有与动画相关的事件,这样可以让您在动画完成后查询和分析它们。以下示例启动了追踪器并配置它在动画完成后记录所有事件
POPAnimationTracer *tracer = anim.tracer;
tracer.shouldLogAndResetOnCompletion = YES;
[tracer start];
有关更多详细信息,请参阅POPAnimationTracer.h
。
Pop具有广泛的单元测试覆盖率。为了安装测试依赖项,导航到pop目录的根部并键入
pod install
假设已安装CocoaPods,这将包含必要的OCMock依赖项,用于单元测试目标。
由于SceneKit要求iOS 8和OS X 10.9,因此POP的SceneKit扩展并非默认提供。不幸的是,由于弱链接框架存在的问题,并且这些问题在Xcode 6.1发布说明中提到,因此不能使用弱链接框架。
为了纠正这一点,您可以轻松地选择使用SceneKit!只需将此添加到Xcode项目的预处理器宏部分即可
POP_USE_SCENEKIT=1
外部资源链接集合,可能非常有价值
查看CONTRIBUTING文件了解如何帮助。
Pop在BSD许可证下发布。查看LICENSE文件获取详细信息。