在核心动画开始之前分层样式的正确方法是什么?
What is a correct way to layer styling before begin time of core animation?
我用 Core Animation 创建了一个函数,它使层高度从 0 到 N 动画化,并且它是可延迟的。
extension CALayer {
func animate(to height: CGFloat, duration: Double, delay: Double) {
let animation: CABasicAnimation = .init(keyPath: "bounds.size.height")
animation.fromValue = 0
animation.toValue = height
animation.beginTime = CACurrentMediaTime() + delay
animation.duration: duration
animation.timingFunction = .init(name: kCAMediaTimingFunctionEaseInEaseOut)
// I want to improvement this part.
//
// self.isHidden = true
//
// DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
// self.isHidden = false
// }
self.bounds.size.height = height
self.add(animation, forKey: "bounds.size.height")
}
}
并且层在动画期间确实变换得很好,但它 returns 在开始时间之前和完成之后达到原始高度。所以我不得不根据延迟时间设置图层isHidden
。
但我不认为这是一种安全的方式。所以我想改进那个代码。
遇到这种情况你一般会怎么做?
尝试设置 animation.fillMode = .backwards
。我认为这将使动画将其 fromValue
应用到层,直到达到动画的 beginTime
。
我用 Core Animation 创建了一个函数,它使层高度从 0 到 N 动画化,并且它是可延迟的。
extension CALayer {
func animate(to height: CGFloat, duration: Double, delay: Double) {
let animation: CABasicAnimation = .init(keyPath: "bounds.size.height")
animation.fromValue = 0
animation.toValue = height
animation.beginTime = CACurrentMediaTime() + delay
animation.duration: duration
animation.timingFunction = .init(name: kCAMediaTimingFunctionEaseInEaseOut)
// I want to improvement this part.
//
// self.isHidden = true
//
// DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
// self.isHidden = false
// }
self.bounds.size.height = height
self.add(animation, forKey: "bounds.size.height")
}
}
并且层在动画期间确实变换得很好,但它 returns 在开始时间之前和完成之后达到原始高度。所以我不得不根据延迟时间设置图层isHidden
。
但我不认为这是一种安全的方式。所以我想改进那个代码。
遇到这种情况你一般会怎么做?
尝试设置 animation.fillMode = .backwards
。我认为这将使动画将其 fromValue
应用到层,直到达到动画的 beginTime
。