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

19
demandé sur Sarreph 2014-03-11 21:22:08

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.

64
répondu Marin Todorov 2015-06-29 16:22:45

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é.

6
répondu David Rönnqvist 2014-03-11 17:37:16
CASpringAnimation est privé (pour l'instant?), mais je suis récemment tombé sur RBBSpringAnimationRBBAnimation projet.

je peux certainement recommander cela, il a été très facile de passer en remplacement de mon CABasicAnimation existante.

4
répondu dmur 2014-04-16 23:37:00

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
    }
}
1
répondu WeZZard 2015-01-07 05:26:18