Pop 是适用于 iOS、tvOS 和 OS X 的可扩展动画引擎。除了基本的静态动画外,它还支持弹簧和衰减动态动画,使其适用于构建基于物理的逼真交互。API 允许快速集成现有的 Objective-C 或 Swift 代码库,并能够在任何对象上动画化任何属性。它是一个成熟且经过充分测试的框架,用于驱动 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(一个是 Mac OS X,一个是 tvOS,另一个是 iOS)。您需要确保添加正确的文件;它们在列表中看起来相同,但请注意列表是按目标顺序填充的。您可以通过检查所列框架旁边的路径来验证是否选择了正确的框架,格式为 <配置>-<平台>
(例如,Debug-iphoneos
)。
注意 2:此方法目前与工作空间兼容性不好。由于目标只能依赖并嵌入与本项目中相同项目的其他目标的产品,因此它仅在 pop.xcodeproj 被添加为当前目标的子项目时才能正常工作。否则,您需要手动在方案中设置构建顺序并将产品复制进来。
静态库(手动)
或者,您可以将项目添加到您的工作空间并采用提供的配置文件,或者手动将 pop 子目录下的文件复制到您的项目中。如果手动安装,请确保通过将 -lc++
包含到项目链接器标志中来链接 C++ 标准库。
使用方法
Pop 采用 Core Animation 显式动画编程模型。通过包含以下导入来使用:
Objective-C
#import <pop/POP.h>
或者如果您使用的是内嵌框架
@import pop;
Swift
import pop
开始、停止和更新
要开始动画,将其添加到您希望动画的对象中
Objective-C
POPSpringAnimation *anim = [POPSpringAnimation animation];
...
[layer pop_addAnimation:anim forKey:@"myKey"];
Swift
let anim = POPSpringAnimation()
...
layer.pop_add(anim, forKey: "myKey")
要停止动画,请从在启动时指定的键映射的对象中移除它
Objective-C
[layer pop_removeAnimationForKey:@"myKey"];
Swift
layer.pop_removeAnimation(forKey: "myKey")
键也可以用来查询动画是否存在。更新运行中的动画的toValue可以为改变方向提供无缝的方式
Objective-C
anim = [layer pop_animationForKey:@"myKey"];
if (anim) {
/* update to value to new destination */
anim.toValue = @(42.0);
} else {
/* create and start a new animation */
....
}
Swift
if let anim = layer.pop_animation(forKey: "myKey") as? POPSpringAnimation {
/* update to value to new destination */
anim.toValue = 42.0
} else {
/* create and start a new animation */
....
}
虽然在上面的例子中使用了层,但Pop界面是在NSObject上的类别添加中实现的。任何NSObject或子类都可以被动画化。
类型
有四种具体的动画类型:弹簧、衰减、基本和自定义。
弹簧动画可以用来给对象带来愉快的弹跳。在这个例子中,我们使用弹簧动画将层的边界从其当前值动画到(0, 0, 400, 400)
Objective-C
POPSpringAnimation *anim = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerBounds];
anim.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 400, 400)];
[layer pop_addAnimation:anim forKey:@"size"];
Swift
if let anim = POPSpringAnimation(propertyNamed: kPOPLayerBounds) {
anim.toValue = NSValue(cgRect: CGRect(x: 0, y: 0, width: 400, height: 400))
layer.pop_add(anim, forKey: "size")
}
衰减动画可以使对象逐渐减速到停止。在本例中,我们每秒减速1000个点数,使层的positionX从当前值和速度开始衰减。
Objective-C
POPDecayAnimation *anim = [POPDecayAnimation animationWithPropertyNamed:kPOPLayerPositionX];
anim.velocity = @(1000.);
[layer pop_addAnimation:anim forKey:@"slide"];
Swift
if let anim = POPDecayAnimation(propertyNamed: kPOPLayerPositionX) {
anim.velocity = 1000.0
layer.pop_add(anim, forKey: "slide")
}
基本动画可以用于在指定时间段内插值值。要使用渐增渐减动画来动画化视图的alpha值,从0.0到1.0,持续默认时长。
Objective-C
POPBasicAnimation *anim = [POPBasicAnimation animationWithPropertyNamed:kPOPViewAlpha];
anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
anim.fromValue = @(0.0);
anim.toValue = @(1.0);
[view pop_addAnimation:anim forKey:@"fade"];
Swift
if let anim = POPBasicAnimation(propertyNamed: kPOPViewAlpha) {
anim.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
anim.fromValue = 0.0
anim.toValue = 1.0
view.pop_add(anim, forKey: "fade")
}
POPCustomAnimation
通过处理CADisplayLink和相关时间步骤管理,简化了自定义动画和转换的创建。请参阅头文件以获取更多详细信息。
属性
属性 animated 由 POPAnimatableProperty
类指定。在示例中,我们创建了一个弹簧动画,并显式设置了对应于 -[CALayer bounds]
的可动画属性。
Objective-C
POPSpringAnimation *anim = [POPSpringAnimation animation];
anim.property = [POPAnimatableProperty propertyWithName:kPOPLayerBounds];
Swift
let anim = POPSpringAnimation()
if let property = POPAnimatableProperty.property(withName: kPOPLayerBounds) as? POPAnimatableProperty {
anim.property = property
}
该框架提供许多常见的层和视图可动画属性。您可以通过创建类的新的实例来自定义动画属性。在此示例中,我们声明了一个自定义音量属性。
Objective-C
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;
Swift
if let prop = POPAnimatableProperty.property(withName: "com.foo.radio.volume", initializer: { prop in
guard let prop = prop else {
return
}
// read value
prop.readBlock = { obj, values in
guard let obj = obj as? Volumeable, let values = values else {
return
}
values[0] = obj.volume
}
// write value
prop.writeBlock = { obj, values in
guard var obj = obj as? Volumeable, let values = values else {
return
}
obj.volume = values[0]
}
// dynamics threshold
prop.threshold = 0.01
}) as? POPAnimatableProperty {
anim.property = prop
}
有关提供的可动画属性及其完整列表,以及声明自定义属性的更多信息,请参阅 POPAnimatableProperty.h
。
调试
以下是调试时的一些建议。POP 遵循模拟器的切换慢速动画设置。尝试启用它以减速动画,并更容易观察交互。
考虑为您的动画命名。这将使您在通过日志记录或调试器引用它们时更容易识别。
Objective-C
anim.name = @"springOpen";
Swift
anim.name = "springOpen"
每个动画都附带一个跟踪器。跟踪器允许您以快速和高效的方式记录所有与动画相关的事件,以便在动画完成后进行查询和分析。以下示例启动跟踪器并将其配置为在动画完成后记录所有事件
Objective-C
POPAnimationTracer *tracer = anim.tracer;
tracer.shouldLogAndResetOnCompletion = YES;
[tracer start];
Swift
if let tracer = anim.tracer {
tracer.shouldLogAndResetOnCompletion = true
tracer.start()
}
有关详细信息,请参阅 POPAnimationTracer.h
。
Testing
Pop 具有广泛的单元测试覆盖。要安装测试依赖项,请导航到 pop 目录的根目录,并键入
pod install
假设安装了 CocoaPods,这将包含单元测试目标所需的必要 OCMock 依赖项。
SceneKit
由于 SceneKit 需要 iOS 8 和 OS X 10.9,因此 POP 的 SceneKit 扩展不是默认提供的。不幸的是,由于 Xcode 6.1 发布说明中提到的弱链接框架问题,无法使用。
为了解决这个问题,您可以轻松选择使用SceneKit!只需将此添加到Xcode项目的预处理器宏部分即可
POP_USE_SCENEKIT=1
资源
一组链接到的外部资源,可能会有价值
- AGGeometryKit+POP - 使用Pop动画四边形
- Apple – 核心动画编程指南
- iOS开发技巧 – 使用Pop实现UIScrollView-like减速
- Pop游乐场 – Pop动画示例仓库
- Pop游乐场2 – 探索Facebook框架
- POP-MCAnimate – Pop动画框架的简洁语法
- Popping - 一个项目中的一些优秀示例
- Rebound – Android的弹簧动画
- Tapity教程 – 入门Pop
- Tweaks – 简单调整开发中iOS应用的参数
- 5步POP教程
- VBFPopFlatButton – 可动画平铺按钮,使用Pop在状态之间转换
贡献力量
查看CONTRIBUTING文件了解如何帮助。
许可
Pop在BSD许可证下发布。有关详细信息,请参阅LICENSE文件。