             return
         }
         
-        indicatorView.layer.addAnimation(lotateAnimation(), forKey: Me.LotateAnimationKey)
-        
-        nextAnimation(expand)
-        
-        let timer: NSTimer
-        if expand {
-            timer = createTimer(timeInterval: strokeDuration, userInfo: Me.ContractAnimationKey, repeats: false)
-        } else {
-            timer = createTimer(timeInterval: strokeDuration * 2, userInfo: Me.GroupAnimationKey, repeats: true)
-        }
-        
+        let animation = lotateAnimation(lotateDuration)
+        indicatorView.layer.addAnimation(animation, forKey: Me.LotateAnimationKey)
+        
+        strokeTransaction(expand)
+        
+        let timer = nextStrokeTimer(expand)
         setStrokeTimer(timer)
     }
     

        return animationCount
    }
    
    private func rotateLayer(count: Double) -> CAShapeLayer {
        animationCount = count
        
        let start = CGFloat(M_PI_2 * (0 - count))

            setStrokeTimer(timer)
        }
        
        strokeTransaction(false)
    }
}

// MARK: - Stroke
public extension SpringIndicator {
    public func strokeRatio(ratio: CGFloat) {
        if ratio <= 0 {
