web-dev-qa-db-ja.com

CALayerアニメーションのSpringWithDamping?

IOS7で導入されたUIView動的アニメーションでたくさん遊んだ後、特に次のようになります。

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

CALayerアニメーションを作成するときに直接アクセスできる、「SpringWithDamping/Velocity」メソッドに相当するものがあるかどうか疑問に思いました。つまりCATransactionCABasicAnimationまたはその他の方法で...

ありがとう

26
Sarreph

in 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を確認します。これにより、調整可能な多数のばねシステム変数(剛性、質量など)が公開されます。

70
Marin Todorov

CASpringAnimation というプライベートクラスがあります(そしてしばらくの間)、そのすべての背後で使用されていると確信しています(ただし、検証はしていません)。残念ながら、それはまだプライベートです。

6

Davidが言ったように、CASpringAnimationはプライベートです(今のところ?)が、最近、 RBBAnimation プロジェクトからRBBSpringAnimationに出くわしました。

私は間違いなくこれをお勧めできます。既存のCABasicAnimationの代わりとして非常に簡単に立ち寄ることができました。

4
dmur

CASpringAnimationインスタンスを作成するクラスを作成しました。それは非常に簡単な方法で機能します:

UIKit APIから春のアニメーションを作成することで、作成されたCASpringAnimationインスタンスをビューのレイヤーから停止し、コピーして返します。

しかし、この方法でCASpringAnimationを作成することがAppStoreで安全かどうかはわかりません。

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