SpringWithDamping为CALayeranimation?

在iOS 7中引入的UIViewdynamicanimation玩了很多之后,最显着的是:

 [UIView animateWithDuration: delay: usingSpringWithDamping: initialSpringVelocity: options: animations: completion:]; 

我想知道是否有相当于创build一个CALayeranimation时可以直接访问的'SpringWithDamping / Velocity'方法? 即通过CATransactionCABasicAnimation或其他…

谢谢

iOS9中,苹果终于公开了CASpringAnimation类。

你可以这样使用它:

 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) 

请注意,您无法设置animation持续时间 – 您需要向CASpringAnimation类请求settlingDuration持续时间(例如,“弹簧系统需要多less时间”),然后将其设置为animation的持续时间。

检查头文件CASpringAnimation – 它暴露了一些你可以调整的弹簧系统variables – 刚度,质量等

有(而且已经有一段时间)一个叫做CASpringAnimation的私人类,我敢肯定它正在使用它(但我没有证实它)。 不幸的是,它仍然是私人的。

正如David所说, CASpringAnimation是私有的(现在呢?),但是我最近在RBBAnimation项目中遇到了RBBSpringAnimation 。

我可以肯定地推荐这个,作为我现有的CABasicAnimation的替代品,这很容易。

我写了一个类来创buildCASpringAnimation实例。 它的工作原理非常简单:

通过从UIKit API创build一个弹簧animation,它从视图的图层中CASpringAnimation创build的CASpringAnimation实例,将其复制并返回。

但是我不知道App Store是否安全,以这种方式创buildCASpringAnimation

 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 } }