             self.layer.cornerRadius = normalCornerRadius
         }
     }
-
+    
     var cachedTitle: String?
+    var isAnimating = false
 
     public override init(frame: CGRect) {
         super.init(frame: frame)
         self.setup()
     }
-
+    
     public required init!(coder aDecoder: NSCoder) {
         super.init(coder: aDecoder)!
         self.setup()
     }
-
+    
     func setup() {
         self.clipsToBounds = true
         spiner.spinnerColor = spinnerColor
     }
-
+    
     open func startLoadingAnimation() {
+        self.isAnimating = true
         self.cachedTitle = title(for: UIControlState())
         self.setTitle("", for: UIControlState())
-        UIView.animate(withDuration: 0.1, animations: { () -> Void in
-            self.layer.cornerRadius = self.frame.height / 2
-            }, completion: { (done) -> Void in
-                self.shrink()
-                Timer.schedule(delay: self.shrinkDuration - 0.25) { timer in
-                    self.spiner.animation()
-                }
-        }) 
+        self.layer.addSublayer(spiner)
         
+        // Animate
+        self.cornerRadius()
+        self.shrink()
+        _ = Timer.schedule(delay: self.shrinkDuration - 0.25) { timer in
+            self.spiner.animation()
+        }
     }
-
+    
     open func startFinishAnimation(_ delay: TimeInterval,_ animation: CAMediaTimingFunction, completion:(()->())?) {
-        Timer.schedule(delay: delay) { timer in
+        self.isAnimating = true
+        _ = Timer.schedule(delay: delay) { timer in
             self.didEndFinishAnimation = completion
             self.expand(animation)
             self.spiner.stopAnimation()
         }
     }
-
+    
     open func animate(_ duration: TimeInterval,_ animation: CAMediaTimingFunction, completion:(()->())?) {
         startLoadingAnimation()
         startFinishAnimation(duration, animation, completion: completion)
     }
-
+    
     open func setOriginalState() {
         self.returnToOriginalState()
         self.spiner.stopAnimation()

    
    lazy var spiner: SpinerLayer! = {
        let s = SpinerLayer(frame: self.frame)
        self.layer.addSublayer(s)
        return s
    }()
    

    }
    
    open var didEndFinishAnimation : (()->())? = nil
    
    let springGoEase = CAMediaTimingFunction(controlPoints: 0.45, -0.36, 0.44, 0.92)
    let shrinkCurve = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
    let expandCurve = CAMediaTimingFunction(controlPoints: 0.95, 0.02, 1, 0.05)
