IOS7で導入されたUIView
動的アニメーションでたくさん遊んだ後、特に次のようになります。
[UIView animateWithDuration: delay: usingSpringWithDamping: initialSpringVelocity: options: animations: completion:];
CALayer
アニメーションを作成するときに直接アクセスできる、「SpringWithDamping/Velocity」メソッドに相当するものがあるかどうか疑問に思いました。つまりCATransaction
、CABasicAnimation
またはその他の方法で...
ありがとう
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
を確認します。これにより、調整可能な多数のばねシステム変数(剛性、質量など)が公開されます。
CASpringAnimation
というプライベートクラスがあります(そしてしばらくの間)、そのすべての背後で使用されていると確信しています(ただし、検証はしていません)。残念ながら、それはまだプライベートです。
Davidが言ったように、CASpringAnimation
はプライベートです(今のところ?)が、最近、 RBBAnimation プロジェクトからRBBSpringAnimation
に出くわしました。
私は間違いなくこれをお勧めできます。既存のCABasicAnimationの代わりとして非常に簡単に立ち寄ることができました。
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
}
}