ios objective-c animation uiview calayer

ios - SpringWithDamping para las animaciones CALayer?



objective-c animation (4)

Después de jugar mucho con las UIView dinámicas UIView presentadas en iOS 7, más notablemente:

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

Me preguntaba si existe un método equivalente al método ''SpringWithDamping / Velocity'' al que se puede acceder directamente al crear una animación CALayer . Es decir, a través de CATransaction , CABasicAnimation o de lo contrario ...

Gracias


Existe (y ha sido durante un tiempo) una clase privada llamada CASpringAnimation que estoy bastante seguro de que se está usando detrás de todo (pero no lo he verificado). Desafortunadamente, todavía es privado.


Como dijo David, CASpringAnimation es privado (¿por ahora?), Pero recientemente me encontré con RBBSpringAnimation del proyecto RBBAnimation .

Definitivamente puedo recomendar esto, fue muy fácil reemplazar a mi CABasicAnimation existente.


Escribí una clase para crear la instancia de CASpringAnimation . Funciona de una manera bastante simple:

Al crear una animación de primavera desde la API de UIKit, detiene la instancia de CASpringAnimation creada desde la capa de la vista, la copia y la devuelve.

Pero no sé si es seguro para App Store crear CASpringAnimation de esta manera.

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


en iOS9 Apple finalmente hizo pública la clase CASpringAnimation .

Puedes usarlo así:

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)

Tenga en cuenta que no puede establecer la duración de la animación; necesita solicitar a la clase CASpringAnimation la CASpringAnimation de settlingDuration (por ejemplo, "Cuánto tiempo tomará para que el sistema de primavera se estabilice") y luego establecerla como la duración de la animación.

Verifique los archivos de cabecera para CASpringAnimation : expone una serie de variables del sistema de resortes que puede ajustar: rigidez, masa, etc.