swift 何时使用UIView动画、CABasicAnimation和UIViewPropertyAnimator?

egdjgwm8  于 2022-11-28  发布在  Swift
关注(0)|答案(1)|浏览(151)

我想知道在哪些情况下我们应该使用其中的任何一个作为最适合的?
在下面的blog https://www.hackingwithswift.com/ios10中,在“重新访问动画”部分中编写的示例中,我们是否可以使用“CABasicAnimation”(表示暂停和恢复动画)重新应用相同的要求?
从我所收集到的信息来看,当我们使用UIView.animate时(...)方法时,它返回一个void,因此我们无法在动画完成之前控制动画,因为我们无法像在UIViewPropertyAnimator中那样获得可处理的返回值(另外,这里我们使用“isRunning”来检查动画的进度。)同样在CABasicAnimation中,我们没有任何进度检查运行动画。2请纠正我,如果我的假设是错误的。3谢谢。

vq8itlhq

vq8itlhq1#

顶级域名

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

背景
所有这些API都很棒,而且它们的用例都略有不同。

  1. iOS上的所有动画都使用Core Animation运行。UIKit的基于块的动画方法只是一个方便的功能。
    1.虽然UIKit和Core Animation都提供动画支持,但它们给予对视图层次结构的不同部分的访问。
    使用UIKit时,动画是使用UIView对象执行的。使用UIKit时可用于动画的属性有:
  • frame
  • bounds
  • center
  • transform
  • alpha
  • backgroundColor
  • contentStretch

虽然核心动画提供了对视图底层的访问,但它提供了一组不同的属性,如下所述(值得注意的是,由于视图和层错综复杂地链接在一起,对视图层的更改会影响视图本身):

  • 图层的大小和位置
  • 执行变换时使用的中心点
  • 转换到3D空间中的图层或其子图层
  • 在图层层次中添加或删除图层
  • 图层相对于其他同级图层的Z轴顺序
  • 图层的阴影
  • 图层的边框(包括图层的角是否为圆角)
  • 在调整大小操作期间拉伸的图层部分
  • 图层的不透明度
  • 位于图层边界之外的子图层的裁剪行为
  • 图层的当前内容
  • 图层的栅格化行为

有关这方面的更多阅读,请参阅此Apple Developer文稿。

UIView的动画方法

在我看来,这些仍然是最容易使用的。非常简单的API,没有太大的代码足迹。我用它来做简单的发射和忘记动画(如使按钮弹出时选择),或当我想做一个复杂的关键帧动画,因为它的关键帧支持是伟大的。
示例:

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

核心动画

也许使用起来不太直接,但是当你想动画层属性而不是视图属性时,你就需要它了,如上所述。例如圆角半径、阴影和边框。
示例:

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()

对于更详细的核心动画,this是一个伟大的文章(不是我写的)。

UI视图属性动画制作器

这是iOS 10中新增的一款基于视图的动画API,顾名思义,它与UIView的动画方式有一些不同之处,最主要的是它支持交互式动画,并允许动态修改动画。你可以暂停、倒带或擦除动画,也可以添加更多的动画块,或者在播放动画时反转动画。这使得它非常强大。当我想让用户控制动画时,我会使用它。通过在animator对象上设置一个fractionComplete属性,可以很容易地将其连接到平移手势识别器或强制触摸识别器(甚至是使用KVO的键)。
如前所述,您还可以存储对UIViewPropertyAnimator的引用,并在动画期间更改其动画或完成块。
示例:

// Create an animation object with an initial 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.animateUIView.animateKeyframes,您实际上可以在UIViewPropertyAnimator动画块中使用这两个动画块。
如果你想要一个更详细的UIViewPropertyAnimator的例子,我写了一个关于here的小教程。

相关问题