swift - 什么时候使用UIView动画,CABasicAnimation和UIViewPropertyAnimator?

标签 swift core-animation ios10 cabasicanimation uiviewpropertyanimator

我想知道在哪种情况下我们应该最适合使用它们?

在下面的博客https://www.hackingwithswift.com/ios10中,即“重新访问动画”部分中编写的示例,我们是否可以使用“CABasicAnimation”重新应用相同的要求,即暂停和恢复动画?

从我收集到的信息来看,当我们使用UIView.animate(...)方法时,它返回一个void,因此我们将无法在动画完成之前对其进行控制,因为我们无法获得返回值来处理正如我们在UIViewPropertyAnimator中获得的一样(在这里,我们还有“isRunning”来检查动画的进度。)
同样在CABasicAnimation中,我们没有任何运行动画的进度检查。
如果我的假设是错误的,请纠正我。
谢谢。

最佳答案

TLDR

  • UIView的动画方法允许对UIView属性进行简单而基本的动画处理,而代码占用很少。
  • 核心动画允许对基础层的属性进行动画处理。
  • UIViewPropertyAnimator允许UIView属性的复杂和动态动画。


  • 背景

    所有这些API都很棒,而且它们的用例也略有不同。在进入他们之前,最好先了解一下
  • iOS上的所有动画均使用Core Animation运行。 UIKit的基于块的动画方法只是一种便利功能。
  • 虽然UIKit和Core Animation都提供了动画支持,但是它们可以访问 View 层次结构的不同部分。

  • 使用UIKit,动画使用UIView对象执行。可使用UIKit进行动画处理的属性有:
  • frame
  • bounds
  • center
  • transform
  • alpha
  • backgroundColor
  • contentStretch

  • 虽然Core Animation可以访问 View 的基础层,但可以公开如下所述的一组不同的属性(值得注意的是,由于 View 和图层之间的链接错综复杂,对 View 层的更改会影响 View 本身):
  • 的大小和位置
  • 执行转换时使用的中心点
  • 转换到3D空间中的图层或其子图层
  • 从图层层次结构
  • 中添加或删除图层
  • 图层相对于其他同级图层的Z顺序
  • 图层的阴影
  • 图层的边框(包括图层的角是否圆角)
  • 调整大小操作期间拉伸(stretch)的图层部分
  • 图层的不透明度
  • 位于图层边界之外的子图层的裁剪行为
  • 的当前内容
  • 图层
  • 的栅格化行为

    有关更多信息,请引用this Apple Developer document

    UIView的动画方法

    我认为这些仍然是最容易使用的。非常简单的API,无需占用太多​​代码空间。我将其用于简单的“即忘即弃”动画(例如,在选择按钮时将其 pop ),或者在我想要制作复杂的关键帧动画时使用,因为它的关键帧支持很好。

    例:
    UIView.animate(withDuration: 0.5, delay: 0.0, options: .curveEaseOut, animations: {
        button.transform = .init(scaleX: 1.1, y: 1.1)
    }
    

    核心动画

    也许使用起来不太直接,但是如上所述,每当要为图层属性而不是 View 属性设置动画时,都需要使用它。这些示例包括拐角半径,阴影和边框。

    例:
    CATransaction.begin()
    CATransaction.setAnimationDuration(0.5)
    CATransaction.timingFunction = .init(name: .easeOut)
    
    let cornerAnimation = CABasicAnimation(keyPath: #keyPath(CALayer.cornerRadius))
    cornerAnimation.fromValue = 0.0
    cornerAnimation.toValue = 10.0
    button.layer.add(cornerAnimation, forKey: #keyPath(CALayer.cornerRadius))
    
    CATransaction.commit()
    

    有关Core Animation的更多详细信息,this是一篇很棒的文章(不是我写的)。

    UIViewPropertyAnimator

    在iOS 10中添加,顾名思义,这是另一个基于 View 的动画API。有几件事使它不同于UIView的动画方法,主要是它支持交互式动画并允许动态修改动画。您可以暂停,倒带或擦洗动画,也可以随时随地添加更多动画块,或者在播放动画时反转动画,这使其功能非常强大。当我希望动画由用户控制时使用。通过在动画对象上设置fractionComplete属性,可以进行擦洗,可以轻松地将其挂接到平移手势识别器或强制触摸识别器(甚至使用KVO的键)上。

    如前所述,您还可以存储对UIViewPropertyAnimator的引用,并在动画过程中更改其动画或完成块。

    例:
    // Create an animation object with an initual color change animation
    let animator = UIViewPropertyAnimator(duration: duration, curve: .linear) {
        button.backgroundColor = .blue
    }
    
    // At any point during the runtime, we can amend the list of animations like so
    animator.addAnimations {
        button.transform = .init(scaleX: 1.1, y: 1.1)
    }
    
    animator.startAnimation()
    

    }

    值得注意的是,如果您需要同时使用UIView.animate动画块,则可以实际使用UIView.animateKeyframesUIViewPropertyAnimator

    如果您想要UIViewPropertyAnimator的更详细的示例,我在here上写了一个小教程。

    关于swift - 什么时候使用UIView动画,CABasicAnimation和UIViewPropertyAnimator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42802984/

    相关文章:

    swift - 仅适用于 super View 的动画变换

    objective-c - 当从 iOS10 中的 UIActivityViewController 呈现时,无法在邮件编辑器中设置发送和取消按钮的文本颜色

    ios - 如何在不使用本地通知的情况下将 IOS 应用程序从后台带到前台?

    swift - 使用 Storyboard 和自定义 View Controller init

    Swift:不能在函数内使用 navigationController.pushViewController

    ios - 当我回到包含 ARSCNView 的 View Controller 时,相机卡住。如何在 ARSCNView 停止工作的情况下进入和离开这个 View Controller ?

    swift - 安排指定日期的通知

    ios - 如何发送 json 作为参数 iOS swift?

    objective-c - CALayer 的 magnificationFilter 在 OS X 上被忽略

    ios - 当有很多 UIView 动画与使用阴影的 UILabels 一起运行并且我按下主页按钮时,设备会卡住