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.