用于CALayer动画的SpringWithDamping?

时间:2014-03-11 17:22:09

标签: ios objective-c animation uiview calayer

在使用iOS 7中引入的UIView动态动画进行了大量游戏后,最引人注目的是:

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

我想知道是否有相当于' SpringWithDamping / Velocity'创建CALayer动画时可以直接访问的方法?即通过CATransactionCABasicAnimation或其他方式......

由于

4 个答案:

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