SpringWithDamping for CALayer animations?

后端 未结 4 671
独厮守ぢ
独厮守ぢ 2021-02-05 04:00

After playing around a lot with the UIView dynamic animations introduced in iOS 7, most notably:

[UIView animateWithDuration: delay: usingSpringWi         


        
相关标签:
4条回答
  • 2021-02-05 04:09

    As David said, CASpringAnimation is private (for now?), but I recently came across RBBSpringAnimation from the RBBAnimation project.

    I can definitely recommend this, it was very easy to drop in as a replacement for my existing CABasicAnimation.

    0 讨论(0)
  • 2021-02-05 04:10

    in iOS9 Apple finally made the CASpringAnimation class public.

    You can use it like that:

    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)
    

    Notice that you cannot set the animation duration - you need to ask the CASpringAnimation class for the settlingDuration (e.g. "How much time is going to take for the spring system to settle down") and then set it as the duration of your animation.

    Check the header files for CASpringAnimation - it exposes a number of spring system variables you can adjust - stiffness, mass, etc.

    0 讨论(0)
  • 2021-02-05 04:23

    There is (and have been for a while) a private class called CASpringAnimation that I'm pretty sure is being used behind it all (but I haven't verified it). Unfortunately, it is still private.

    0 讨论(0)
  • 2021-02-05 04:26

    I wrote a class to create CASpringAnimation instance. It works in a pretty simple way:

    By creating a spring animation from UIKit API, it arrests the created CASpringAnimation instance from the view's layer, copies it and returns it.

    But I don't know if it is App Store safe that to create CASpringAnimation in this way.

    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
        }
    }
    
    0 讨论(0)
提交回复
热议问题