CABasicAnimation 没有插值

Posted

技术标签:

【中文标题】CABasicAnimation 没有插值【英文标题】:CABasicAnimation without interpolation values 【发布时间】:2018-04-20 09:39:26 【问题描述】:

Apple 的文档 link 指出:

fromValue、byValue 和 toValue 属性定义了在其间插值的值。所有都是可选的,不超过两个应该是非零的。对象类型应与动画属性的类型相匹配。

插值使用如下:

所有属性均为零。在目标层表示层中 keyPath 的先前值和目标层表示层中 keyPath 的当前值之间进行插值。

如何在不指定fromValuebyValuetoValue 的情况下完成这项工作?

在这里,我只是为 cornerRadius 属性的变化设置动画。

我知道如何使用toValue 制作这个动画。但我只想知道是否有比这更简单的代码来实现它:

import UIKit
import PlaygroundSupport

let rect = CGRect(x: 0,y: 0, width: 300, height: 400)
let view = UIView(frame: rect)
view.backgroundColor = UIColor.yellow
PlaygroundPage.current.liveView = view

let layer = CALayer()
layer.backgroundColor = UIColor.red.cgColor
layer.frame = CGRect(x: 75, y: 75, width: 150, height: 150)
view.layer.addSublayer(layer)

layer.cornerRadius = 15
let animation = CABasicAnimation(keyPath:#keyPath(CALayer.cornerRadius))
animation.toValue = layer.bounds.width / 2
animation.duration = 1
layer.add(animation, forKey: nil)

【问题讨论】:

您能描述一下您要创建的动画吗? @DavidRönnqvist 我已经更新了问题。 【参考方案1】:

在某些情况下,如果您已经设置了没有动画的层的最终值,您可以跳过在 CABasicAnimation 中同时设置 toValuefromValue,因为运行时会从当前值获取 fromValue表示层和模型层当前值的toValue

例如,在我自己的代码中,事实证明我可以减少这种指定动画的完整形式...

        let startValue = arrow.transform
        let endValue = CATransform3DRotate(startValue, .pi/4.0, 0, 0, 1)
        CATransaction.setDisableActions(true)
        arrow.transform = endValue
        let anim = CABasicAnimation(keyPath:#keyPath(CALayer.transform))
        anim.duration = 0.8
        let clunk = CAMediaTimingFunction(controlPoints:0.9, 0.1, 0.7, 0.9)
        anim.timingFunction = clunk
        anim.fromValue = startValue
        anim.toValue = endValue
        arrow.add(anim, forKey:nil)

...至此(注意fromValuetoValue 被省略):

        CATransaction.setDisableActions(true)
        arrow.transform = CATransform3DRotate(arrow.transform, .pi/4.0, 0, 0, 1)
        let anim = CABasicAnimation(keyPath:#keyPath(CALayer.transform))
        anim.duration = 0.8
        let clunk = CAMediaTimingFunction(controlPoints:0.9, 0.1, 0.7, 0.9)
        anim.timingFunction = clunk
        arrow.add(anim, forKey:nil)

但是,我不推荐这种方法。始终提供fromValuetoValue 更加可靠。是的,它多了两行代码,但为了避免混淆,这是一个很小的代价。有时,清晰就是简单。

【讨论】:

查看我书中的讨论:apeth.com/iosBook/ch17.html#_using_a_cabasicanimation 这显示了使用 CABasicAnimation 的最完整形式以及一些简化形式,并解释了为什么可以减少。 问题正是您对另一个答案的评论中的“保证”。你不能“确定”,所以最好只给出值。 添加了一个实际示例,我可以省略 toValuefromValue。但是不要。它并不总是有效,你只会让自己感到困惑。 感谢您询问我真正了解的事情! :) 好吧,游乐场并不是真实的世界。我向您保证,当您下载实际项目并将其作为项目运行时,我的可下载示例确实可以正常工作。

以上是关于CABasicAnimation 没有插值的主要内容,如果未能解决你的问题,请参考以下文章

当我在animationDidStart中设置结束值时,CABasicAnimation没有插值:

CABasicAnimation来做心跳动画

Core Animation2-CABasicAnimation

CABasicAnimation 3D旋转

iOS Core Animation

ios开发之核心动画四:核心动画-Core Animation--CABasicAnimation基础核心动画