在使用iOS 7中引入的UIView
动态动画进行了大量游戏后,最引人注目的是:
[UIView animateWithDuration: delay: usingSpringWithDamping: initialSpringVelocity: options: animations: completion:];
我想知道是否有相当于' SpringWithDamping / Velocity'创建CALayer
动画时可以直接访问的方法?即通过CATransaction
,CABasicAnimation
或其他方式......
由于
答案 0 :(得分:69)
在 iOS9 中Apple终于将let spring = CASpringAnimation(keyPath: "position.x")
spring.damping = 5
spring.fromValue = myLayer.position.x
spring.toValue = myLayer.position.x + 100.0
spring.duration = spring.settlingDuration
myLayer.addAnimation(spring, forKey: nil)
类公开了。
你可以这样使用它:
CASpringAnimation
请注意,您无法设置动画持续时间 - 您需要向settlingDuration
课程询问CASpringAnimation
(例如“弹簧系统需要多长时间才能安定下来”)和然后将其设置为动画的持续时间。
检查{{1}}的头文件 - 它暴露了一些你可以调整的弹簧系统变量 - 刚度,质量等。
答案 1 :(得分:6)
有一段名为CASpringAnimation
的私人班级(并且已经有一段时间了),我很确定它正在使用它(但我还没有验证它)。不幸的是,它仍然是私人的。
答案 2 :(得分:4)
正如David所说,CASpringAnimation
是私有的(现在?),但我最近从RBBAnimation项目中遇到了RBBSpringAnimation
。
我绝对可以推荐这个,它很容易作为现有CABasicAnimation的替代品。
答案 3 :(得分:1)
我写了一个类来创建CASpringAnimation
实例。它以一种非常简单的方式工作:
通过从UIKit API创建弹簧动画,它从视图的图层中取消创建的CASpringAnimation
实例,复制并返回它。
但我不知道以这种方式创建CASpringAnimation
是否安全App Store。
import UIKit
private let SharedCASpringAnimationFactory = CASpringAnimationFactory()
public class CASpringAnimationFactory {
private var dummyView: UIView
private init() {
dummyView = UIView(frame: CGRect.zeroRect)
}
private class var shared: CASpringAnimationFactory {
return SharedCASpringAnimationFactory
}
public class func animation(#keyPath: String, dumping: CGFloat, initialSpringVelocity: CGFloat) -> CABasicAnimation {
let duration = CATransaction.animationDuration()
UIView.animateWithDuration(duration, delay: 0.0, usingSpringWithDamping: dumping, initialSpringVelocity: initialSpringVelocity, options: nil,
animations: { () -> Void in
CASpringAnimationFactory.shared.dummyView.bounds = CGRect(origin: CGPoint.zero, size: CGSize(width: 100, height: 100))
}, completion: nil)
let dummyLayer = CASpringAnimationFactory.shared.dummyView.layer
let animations = dummyLayer.animationKeys().map {dummyLayer.animationForKey($0 as String) as CAAnimation}
let arrestedAnimation = animations.first!.copy() as CABasicAnimation
arrestedAnimation.keyPath = keyPath
arrestedAnimation.fromValue = nil
arrestedAnimation.toValue = nil
dummyLayer.removeAllAnimations()
shared.dummyView.bounds = CGRect.zeroRect
return arrestedAnimation
}
}