【问题标题】:SpringWithDamping for CALayer animations?CALayer 动画的 SpringWithDamping?
【发布时间】:2014-04-15 10:29:46
【问题描述】:

在玩了很多 iOS 7 中引入的 UIView 动态动画之后,最值得注意的是:

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

我想知道在创建CALayer 动画时是否可以直接访问等效于“SpringWithDamping/Velocity”的方法? IE。通过CATransactionCABasicAnimation 或其他方式...

谢谢

【问题讨论】:

  • 在下面查看我的答案 - iOS9 中有一个新类可以做到这一点

标签: ios objective-c animation uiview calayer


【解决方案1】:

iOS9中,Apple 终于公开了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)

请注意,您无法设置动画持续时间 - 您需要向 CASpringAnimation 类询问 settlingDuration(例如“弹簧系统需要多长时间才能稳定下来”),然后将其设置为动画的持续时间。

检查 CASpringAnimation 的头文件 - 它公开了许多您可以调整的弹簧系统变量 - 刚度、质量等。

【讨论】:

  • “注意你不能设置动画持续时间”——你实际上可以将它设置为任何值,但如果它太短它可能会在稳定之前突然停止所以如果你不想做猜测自己工作settlingDuration 是要走的路。
【解决方案2】:

有(并且已经有一段时间了)一个名为CASpringAnimation 的私有类,我很确定它被用于它背后(但我还没有验证它)。不幸的是,它仍然是私人的。

【讨论】:

  • 感谢@David,这也是我发现的,但由于它是私有的,我不想在部署中使用它。 — 您是否碰巧在任何其他实现相同效果的库/类中有任何个人经验?谢谢!
  • @Rorz 不,我对其他库没有任何经验。对不起
【解决方案3】:

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

我绝对可以推荐这个,它很容易替代我现有的 CABasicAnimation。

【讨论】:

  • 同意,使用 RBBSpringAnimation 是 CASpringAnimation 的准确替代品。如果您尝试支持 iOS 7 和 8,则很有用。
【解决方案4】:

我写了一个类来创建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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多