Pop 是一个可扩展的动画引擎,适用于 iOS、tvOS 和 OS X。除了基本静态动画外,它还支持弹簧和衰减动态动画,使其对于构建基于物理的真实交互非常有用。API 允许快速集成到现有的 Objective-C 代码库中,并可以动化任何对象的任何属性。它是一个成熟且经过充分测试的框架,它驱动了 Paper (https://#/paper) 中的所有动画和过渡。
Pop 可在 CocoaPods 上找到。只需将以下内容添加到项目的 Podfile 中:
pod 'pop', '~> 1.0'
在有主要分支修复错误后,通过指定版本进行释放。如果您倾向于使用最新版本的边缘代码,您可以使用以下 Podfile 条目从主分支使用 Pop:
pod 'pop', :git => 'https://github.com/facebook/pop.git'
通过将项目添加到您的项目中,并在应用目标的一般选项卡中嵌入式二进制部分添加 pop.embedded 框架,您可以在几秒钟内设置 pop!这还启用了使用头模块的 @import pop
语法。
注意:由于 Xcode 中的一些不巧的限制,嵌入式二进制必须与模块共享相同的名称,并且必须使用 .framework
作为扩展名。这意味着当您添加嵌入式二进制时,您将看到三个 pop.framework(分别为 OS X、tvOS 和 iOS)。您需要确保添加 iOS 版本,并且由于此列表按目标顺序填充,可以安全地假设它是第二个。您可以通过检查框架旁边的路径来验证是否选择了正确的版本:`Debug-iphoneos`。tvOS 中的原理相同,但应查找 Debug-appletvos
而不是 `Debug-iphoneos`。
注意 2:此方法目前不适用于工作空间。由于某些未知原因,当 pop.xcodeproj 放在工作空间中时,Xcode 简单地拒绝将 pop.framework 作为嵌入式二进制添加。此方法仅当将 pop.xcodeproj 添加为目标项目的子项目时才有效。
或者,您可以将项目添加到工作空间中,并采用提供的配置文件,或者手动将 pop 子目录下的文件复制到您的项目中。如果您手动安装,请确保还链接了 C++ 标准库,包括将 -lc++
添加到您的项目链接器标志中。
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或其子类都可以进行动画处理。
有四种具体的动画类型:弹簧、衰减、基本和自定义。
Spring动画可用于使对象产生令人愉快的弹跳效果。在这个例子中,我们使用一个弹簧动画来动画化层的边界,从当前值到(0, 0, 400, 400)
POPSpringAnimation *anim = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerBounds];
anim.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 400, 400)];
[layer pop_addAnimation:anim forKey:@"size"];
Decay动画可以用于逐渐减慢一个对象的速度,使其停止。在这个例子中,我们使层的positionX从当前位置和速度1000pts/秒衰减
POPDecayAnimation *anim = [POPDecayAnimation animationWithPropertyNamed:kPOPLayerPositionX];
anim.velocity = @(1000.);
[layer pop_addAnimation:anim forKey:@"slide"];
Basic动画可以用于在指定时间内插值值。使用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和相关的时间步管理简化了自定义动画和转换的创建。见头文件以了解更多详细信息。
属性animated由POPAnimatableProperty
类指定。在这个例子中,我们创建了一个弹簧动画,并明确设置了对应于-[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,因此POPSceneKit扩展不是现成的。不幸的是,由于弱链接框架的问题,根据Xcode 6.1版本说明中提到的内容,无法使用。
为了解决这个问题,您可以轻松选择使用SceneKit!只需将其添加到Xcode项目中的预处理器宏部分。
POP_USE_SCENEKIT=1
一组外部资源链接,这些资源可能很有价值
查看CONTRIBUTING文件了解如何帮助。
Pop遵循BSD许可证。有关详细信息,请参阅LICENSE文件。