CABasicAnimation 没有插值
Posted
技术标签:
【中文标题】CABasicAnimation 没有插值【英文标题】:CABasicAnimation without interpolation values 【发布时间】:2018-04-20 09:39:26 【问题描述】:Apple 的文档 link 指出:
fromValue、byValue 和 toValue 属性定义了在其间插值的值。所有都是可选的,不超过两个应该是非零的。对象类型应与动画属性的类型相匹配。
插值使用如下:
所有属性均为零。在目标层表示层中 keyPath 的先前值和目标层表示层中 keyPath 的当前值之间进行插值。
如何在不指定fromValue
、byValue
或toValue
的情况下完成这项工作?
在这里,我只是为 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 中同时设置 toValue
和 fromValue
,因为运行时会从当前值获取 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)
...至此(注意fromValue
和toValue
被省略):
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)
但是,我不推荐这种方法。始终提供fromValue
和toValue
更加可靠。是的,它多了两行代码,但为了避免混淆,这是一个很小的代价。有时,清晰就是简单。
【讨论】:
查看我书中的讨论:apeth.com/iosBook/ch17.html#_using_a_cabasicanimation 这显示了使用 CABasicAnimation 的最完整形式以及一些简化形式,并解释了为什么可以减少。 问题正是您对另一个答案的评论中的“保证”。你不能“确定”,所以最好只给出值。 添加了一个实际示例,我可以省略toValue
和 fromValue
。但是不要。它并不总是有效,你只会让自己感到困惑。
感谢您询问我真正了解的事情! :)
好吧,游乐场并不是真实的世界。我向您保证,当您下载实际项目并将其作为项目运行时,我的可下载示例确实可以正常工作。以上是关于CABasicAnimation 没有插值的主要内容,如果未能解决你的问题,请参考以下文章
当我在animationDidStart中设置结束值时,CABasicAnimation没有插值: