EasyAnimation 2.2.1

EasyAnimation 2.2.1

测试已测试
语言语言 SwiftSwift
许可 MIT
发布最后发布2018年9月
SPM支持SPM

Marin Todorov维护。




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 - 第一个测试版