SpringWithDamping pour des animations CALayer?
Après avoir joué beaucoup avec l' UIView
animations dynamiques introduites dans iOS 7, notamment:
[UIView animateWithDuration: delay: usingSpringWithDamping: initialSpringVelocity: options: animations: completion:];
je me demandais s'il y avait un équivalent à la méthode 'SpringWithDamping/Velocity' qui peut être consulté directement lors de la création d'un CALayer
animation? I. e. soit par le biais d' CATransaction
,CABasicAnimation
ou autrement...
Merci
4 réponses
iOS9 Apple a enfin fait l' CASpringAnimation
publique de la classe.
Vous pouvez l'utiliser comme ça:
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)
notez que vous ne pouvez pas définir la durée de l'animation - vous devez demander le CASpringAnimation
classe settlingDuration
(par exemple, "Combien de temps va prendre pour le système de ressort pour s'installer") puis définir la durée de votre animation.
Vérifier les fichiers d'en-tête CASpringAnimation
- il expose un certain nombre de variables de système de ressort que vous pouvez ajuster - la rigidité, de masse, etc.
Il y a (et ont été pendant un certain temps) un cours privé appelé CASpringAnimation
que je suis à peu près sûr est utilisé derrière tout ça (mais je n'ai pas vérifié). Malheureusement, c'est encore privé.
RBBSpringAnimation
RBBAnimation projet.
je peux certainement recommander cela, il a été très facile de passer en remplacement de mon CABasicAnimation existante.
j'ai écrit une classe pour créer CASpringAnimation
instance. Il fonctionne d'une manière assez simple:
en créant une animation de printemps à partir de L'API UIKit, il arrête la création CASpringAnimation
instance à partir du calque de la vue, le copie et le renvoie.
Mais je ne sais pas si c'est de l'App Store coffre de créer CASpringAnimation
de cette façon.
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( 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
}
}