ver 2.0
注意! 2.0版本中的重大更改 - 由于有很多请求,EasyAnimation在导入时不会自动安装。您需要在您的代码中某处调用EasyAnimation.enable()
来启用它(AppDelegate是一个很好的选择,因为一旦您的应用启动,它就会启用EasyAnimation)。
该库不使用任何私有API - 使用它的应用应该可以正常发布到App Store。
简介 层动画 弹簧层动画 链式动画 取消链式动画 |
安装 致谢 许可 版本历史 |
简介
UIView.animateWithDuration:animations:
非常容易使用,并且你对其语法如此熟悉,以至于你常常想要它自动为你做更多的事情。但它不这样做,你需要导入Bloated.framework,由Beginner Ninja Coder提供,才能制作比animateWithDuration:animations:
允许的更复杂的动画。
EasyAnimation扩展了UIKit在动画方面提供的内容,使得你的生活变得更轻松,因为你可以不学习任何新鲜语法就完成很多任务。
在2.0及更高版本中,要启用所有EasyAnimation功能,您需要一次性运行此代码 - AppDelegate是一个很好的地方,因为一旦您的应用启动,它就会启用EasyAnimation。
EasyAnimation.enable()
在您的其他类中,您不需要导入EasyAnimation或执行任何其他操作。一旦调用enable()
之后,您就可以像通常使用UIKit API一样使用它了。
Easy 层动画
EasyAnimation 允许您直接从 animate(duration:animations:...)
动画化您的层。不再需要 CABasicAnimation
代码。只需在 animations
块中调整层的属性,EasyAnimation 会负责其余部分。
CoreAnimation(之前) |
---|
let anim = CABasicAnimation(keyPath: "position.x")
anim.fromValue = 100.0
anim.toValue = 200.0
anim.duration = 2.0
view.layer.addAnimation(anim, forKey: nil) |
EasyAnimation(之后) |
---|
UIView.animate(duration: 2.0, animations: {
self.view.layer.position.x = 200.0
}) |
(是的,此示例在没有 EasyAnimation 的情况下也运行良好,但我仍然保留在此以供演示。)
或者,如果您需要指定延迟、动画选项和/或动画曲线
CoreAnimation(之前) |
---|
let anim = CABasicAnimation(keyPath: "position.x")
anim.fromValue = 100.0
anim.toValue = 200.0
anim.duration = 2.0
anim.fillMode = kCAFillModeBackwards
anim.beginTime = CACurrentMediaTime() + 2.0
anim.timingFunction = CAMediaTimingFunction(name:
kCAMediaTimingFunctionEaseOut)
anim.repeatCount = Float.infinity
anim.autoreverses = true
view.layer.addAnimation(anim, forKey: nil) |
EasyAnimation(之后) |
---|
UIView.animate(duration: 2.0, delay: 2.0,
options: [.repeat, .autoreverse, .curveEaseOut],
animations: {
self.view.layer.position.x += 200.0
// let's add more animations
// to make it more interesting!
self.view.layer.cornerRadius = 20.0
self.view.layer.borderWidth = 5.0
}, completion: nil)
|
或者如果您想动画完成后执行一段代码 —— 祝您在设置动画代理和编写代理方法时好运。
使用 EasyAnimation,您只需将代码作为 completion
参数的值放入,当您的动画完成后,EasyAnimation 会为您执行它。
弹性层动画
自从 iOS9 开始使用 CoreAnimation 和 CABasicAnimation
以来,我一直缺少创建弹跳动画的方法。幸运的是,一个方便的库 RBBAnimation
为层提供了一个非常出色的弹性动画实现 - 我将代码转换为 Swift,并将 RBBSpringAnimation
包含在 EasyAnimation
中。
Easy Animation 在您的应用在 iOS9 或更高版本上运行时,会使用新的 iOS9 弹性动画类 CASpringAnimation
,在您的应用在 iOS8 上运行时,回退到 RBBSpringAnimation
。
以下是创建层位置、转换和圆角半径弹性动画的代码示例
EasyAnimation |
---|
UIView.animate(duration: 2.0, delay: 0.0,
usingSpringWithDamping: 0.25,
initialSpringVelocity: 0.0,
options: [],
animations: {
self.view.layer.position.x += 200.0
self.view.layer.cornerRadius = 50.0
self.view.layer.transform = CATransform3DMakeScale(1.2, 1.2, 1.0)
}, completion: nil) |
Sam Davies 协助编写弹性动画代码。非常感谢 - 没有您的帮助,我无法独自完成这项工作!
链动画
animate(duration:animations:..)
非常方便,但将一个动画链接到另一个动画是一项主要痛苦的事情(尤其是如果我们谈论超过 2 个动画)。
EasyAnimation 允许您使用一个方法将两个或更多动画链接在一起。调用 animateAndChain(duration:delay:options:animations:completion:)
并将它链接到更多动画。使用 animate(duration:animations...)
或任何其他方法创建链式动画。
EasyAnimation |
---|
UIView.animateAndChain(duration: 1.0, delay: 0.0,
options: [], animations: {
self.view.center.y += 100
}, completion: nil).animate(duration: 1.0, animations: {
self.view.center.x += 100
}).animate(duration: 1.0, animations: {
self.view.center.y -= 100
}).animate(duration: 1.0, animations: {
self.view.center.x -= 100
}) |
是的 - 这可以工作,在您的项目中试试看!
此代码将沿矩形路径动画化视图 - 首先向下,然后向右,然后向上,然后回到动画开始的初始点。
这是一个重复动画并使动画持续运行完美机会!在链的最后一个 animate(duration:...
中添加 options
参数并打开 .repeat
选项。
这会使整个链(例如,4个动画)持续重复。
如果您想在链中的任何两个动画之间暂停 - 只需使用 delay
参数,它就会正常工作。
注意:animateAndChain
不会创建可以被随时添加动画的顺序队列。您像上面示例那样用一个调用进行一次动画调度,它就会自动运行,您不能向和从序列中添加或删除动画。
取消链动画
如果屏幕上有一个重复的(或正常的)链动画,您可以在任何时间取消它。只需抓住动画对象,在您想要取消动画的任何时候调用 cancelAnimationChain
。
let chain = UIView.animateAndChain(duration: 1.0, delay: 0.0,
options: [], animations: {
self.square.center.y += 100
}, completion: nil).animate(duration: 1.0, animations: {
[... the rest of the animations in the chain]
chain.cancelAnimationChain()
如果动画链被取消后想进行一些清理工作,请向 cancelAnimationChain
方法提供一个代码块。
chain.cancelAnimationChain({
self.myView.center = initialPosition
//etc. etc.
})
动画不会立即停止,但它会完成链中的当前步骤后停止,并取消本链中所有计划的动画。
安装
- CocoaPods:将其添加到项目的 Podfile
pod 'EasyAnimation'
-
Carthage:如果您能帮助添加对 Carthage 的支持,请告诉我。
-
源代码:要使用源代码安装 - 克隆此仓库或以 zip 文件的形式下载源代码。将
EasyAnimation
文件夹中的所有文件包含到您的项目中。
致谢
作者: Marin Todorov
关于 Marin 的更多信息
iOS 动画教程,作者 |
iOS 动画邮件快讯,作者 |
包括 Robert Böhnke 的 RBBAnimation 的部分内容。代码由 Marin Todorov 从 Objective-C 转换为 Swift。
弹簧动画集成的合作者: Sam Davies。
许可协议
EasyAnimation
在 MIT 许可下可用。有关更多信息,请参阅 LICENSE 文件。
RBBAnimation
许可证: https://github.com/robb/RBBAnimation/blob/master/LICENSE
待办
- 链式动画中可以使用
.autoreverse
(如果可能的话) - 通过自定义属性添加路径上关键帧动画的支持
版本历史
- 2.0 -
initialize()
已弃用,因此需要手动初始化 - 1.1 - Xcode 8
- 1.0.5 - 与 Xcode 7.3 兼容
- 1.0.4 - Swift 3 兼容性更改
- 1.0.2 - 修复所有人的 openGL 视图崩溃问题
- 1.0.1 - 漏洞修复
- 1.0 - Swift 2.0 和 iOS9
- 0.7 - 修复一批错误和许多改进
- 0.6 - 第一个测试版