ChartEasingOption
// elapsed: v. 时间过去;消逝(elapse的过去分词) // duration: n. 持续,持续的时间,期间 public typealias ChartEasingFunctionBlock = ((elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat)
// 根据动画过渡类型,获取动画函数 internal func easingFunctionFromOption(easing: ChartEasingOption) -> ChartEasingFunctionBlock { switch easing { case .Linear: return EasingFunctions.Linear case .EaseInQuad: return EasingFunctions.EaseInQuad case .EaseOutQuad: return EasingFunctions.EaseOutQuad case .EaseInOutQuad: return EasingFunctions.EaseInOutQuad case .EaseInCubic: return EasingFunctions.EaseInCubic case .EaseOutCubic: return EasingFunctions.EaseOutCubic case .EaseInOutCubic: return EasingFunctions.EaseInOutCubic case .EaseInQuart: return EasingFunctions.EaseInQuart case .EaseOutQuart: return EasingFunctions.EaseOutQuart case .EaseInOutQuart: return EasingFunctions.EaseInOutQuart case .EaseInQuint: return EasingFunctions.EaseInQuint case .EaseOutQuint: return EasingFunctions.EaseOutQuint case .EaseInOutQuint: return EasingFunctions.EaseInOutQuint case .EaseInSine: return EasingFunctions.EaseInSine case .EaseOutSine: return EasingFunctions.EaseOutSine case .EaseInOutSine: return EasingFunctions.EaseInOutSine case .EaseInExpo: return EasingFunctions.EaseInExpo case .EaseOutExpo: return EasingFunctions.EaseOutExpo case .EaseInOutExpo: return EasingFunctions.EaseInOutExpo case .EaseInCirc: return EasingFunctions.EaseInCirc case .EaseOutCirc: return EasingFunctions.EaseOutCirc case .EaseInOutCirc: return EasingFunctions.EaseInOutCirc case .EaseInElastic: return EasingFunctions.EaseInElastic case .EaseOutElastic: return EasingFunctions.EaseOutElastic case .EaseInOutElastic: return EasingFunctions.EaseInOutElastic case .EaseInBack: return EasingFunctions.EaseInBack case .EaseOutBack: return EasingFunctions.EaseOutBack case .EaseInOutBack: return EasingFunctions.EaseInOutBack case .EaseInBounce: return EasingFunctions.EaseInBounce case .EaseOutBounce: return EasingFunctions.EaseOutBounce case .EaseInOutBounce: return EasingFunctions.EaseInOutBounce } }
// 平滑过度函数 internal struct EasingFunctions { internal static let Linear = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in return CGFloat(elapsed / duration); }
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseInQuad</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">var</span> <span class="nv">position</span> <span class="o">=</span> <span class="kt">CGFloat</span><span class="p">(</span><span class="n">elapsed</span> <span class="o">/</span> <span class="n">duration</span><span class="p">)</span>
<span class="k">return</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseOutQuad</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">var</span> <span class="nv">position</span> <span class="o">=</span> <span class="kt">CGFloat</span><span class="p">(</span><span class="n">elapsed</span> <span class="o">/</span> <span class="n">duration</span><span class="p">)</span>
<span class="k">return</span> <span class="o">-</span><span class="n">position</span> <span class="o">*</span> <span class="p">(</span><span class="n">position</span> <span class="o">-</span> <span class="mf">2.0</span><span class="p">)</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseInOutQuad</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">var</span> <span class="nv">position</span> <span class="o">=</span> <span class="kt">CGFloat</span><span class="p">(</span><span class="n">elapsed</span> <span class="o">/</span> <span class="p">(</span><span class="n">duration</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">))</span>
<span class="k">if</span> <span class="p">(</span><span class="n">position</span> <span class="o"><</span> <span class="mf">1.0</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span>
<span class="p">}</span>
<span class="k">return</span> <span class="o">-</span><span class="mf">0.5</span> <span class="o">*</span> <span class="p">((</span><span class="o">--</span><span class="n">position</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">position</span> <span class="o">-</span> <span class="mf">2.0</span><span class="p">)</span> <span class="o">-</span> <span class="mf">1.0</span><span class="p">)</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseInCubic</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">var</span> <span class="nv">position</span> <span class="o">=</span> <span class="kt">CGFloat</span><span class="p">(</span><span class="n">elapsed</span> <span class="o">/</span> <span class="n">duration</span><span class="p">)</span>
<span class="k">return</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseOutCubic</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">var</span> <span class="nv">position</span> <span class="o">=</span> <span class="kt">CGFloat</span><span class="p">(</span><span class="n">elapsed</span> <span class="o">/</span> <span class="n">duration</span><span class="p">)</span>
<span class="n">position</span><span class="o">--</span>
<span class="nf">return</span> <span class="p">(</span><span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">+</span> <span class="mf">1.0</span><span class="p">)</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseInOutCubic</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">var</span> <span class="nv">position</span> <span class="o">=</span> <span class="kt">CGFloat</span><span class="p">(</span><span class="n">elapsed</span> <span class="o">/</span> <span class="p">(</span><span class="n">duration</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">))</span>
<span class="k">if</span> <span class="p">(</span><span class="n">position</span> <span class="o"><</span> <span class="mf">1.0</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span>
<span class="p">}</span>
<span class="n">position</span> <span class="o">-=</span> <span class="mf">2.0</span>
<span class="k">return</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="p">(</span><span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">+</span> <span class="mf">2.0</span><span class="p">)</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseInQuart</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">var</span> <span class="nv">position</span> <span class="o">=</span> <span class="kt">CGFloat</span><span class="p">(</span><span class="n">elapsed</span> <span class="o">/</span> <span class="n">duration</span><span class="p">)</span>
<span class="k">return</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseOutQuart</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">var</span> <span class="nv">position</span> <span class="o">=</span> <span class="kt">CGFloat</span><span class="p">(</span><span class="n">elapsed</span> <span class="o">/</span> <span class="n">duration</span><span class="p">)</span>
<span class="n">position</span><span class="o">--</span>
<span class="k">return</span> <span class="o">-</span><span class="p">(</span><span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">-</span> <span class="mf">1.0</span><span class="p">)</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseInOutQuart</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">var</span> <span class="nv">position</span> <span class="o">=</span> <span class="kt">CGFloat</span><span class="p">(</span><span class="n">elapsed</span> <span class="o">/</span> <span class="p">(</span><span class="n">duration</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">))</span>
<span class="k">if</span> <span class="p">(</span><span class="n">position</span> <span class="o"><</span> <span class="mf">1.0</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span>
<span class="p">}</span>
<span class="n">position</span> <span class="o">-=</span> <span class="mf">2.0</span>
<span class="k">return</span> <span class="o">-</span><span class="mf">0.5</span> <span class="o">*</span> <span class="p">(</span><span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">-</span> <span class="mf">2.0</span><span class="p">)</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseInQuint</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">var</span> <span class="nv">position</span> <span class="o">=</span> <span class="kt">CGFloat</span><span class="p">(</span><span class="n">elapsed</span> <span class="o">/</span> <span class="n">duration</span><span class="p">)</span>
<span class="k">return</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseOutQuint</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">var</span> <span class="nv">position</span> <span class="o">=</span> <span class="kt">CGFloat</span><span class="p">(</span><span class="n">elapsed</span> <span class="o">/</span> <span class="n">duration</span><span class="p">)</span>
<span class="n">position</span><span class="o">--</span>
<span class="nf">return</span> <span class="p">(</span><span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">+</span> <span class="mf">1.0</span><span class="p">)</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseInOutQuint</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">var</span> <span class="nv">position</span> <span class="o">=</span> <span class="kt">CGFloat</span><span class="p">(</span><span class="n">elapsed</span> <span class="o">/</span> <span class="p">(</span><span class="n">duration</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">))</span>
<span class="k">if</span> <span class="p">(</span><span class="n">position</span> <span class="o"><</span> <span class="mf">1.0</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span>
<span class="p">}</span>
<span class="k">else</span>
<span class="p">{</span>
<span class="n">position</span> <span class="o">-=</span> <span class="mf">2.0</span>
<span class="k">return</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="p">(</span><span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">+</span> <span class="mf">2.0</span><span class="p">)</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseInSine</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">var</span> <span class="nv">position</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="n">elapsed</span> <span class="o">/</span> <span class="n">duration</span>
<span class="k">return</span> <span class="kt">CGFloat</span><span class="p">(</span> <span class="o">-</span><span class="nf">cos</span><span class="p">(</span><span class="n">position</span> <span class="o">*</span> <span class="kt">M_PI_2</span><span class="p">)</span> <span class="o">+</span> <span class="mf">1.0</span> <span class="p">)</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseOutSine</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">var</span> <span class="nv">position</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="n">elapsed</span> <span class="o">/</span> <span class="n">duration</span>
<span class="k">return</span> <span class="kt">CGFloat</span><span class="p">(</span> <span class="nf">sin</span><span class="p">(</span><span class="n">position</span> <span class="o">*</span> <span class="kt">M_PI_2</span><span class="p">)</span> <span class="p">)</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseInOutSine</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">var</span> <span class="nv">position</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="n">elapsed</span> <span class="o">/</span> <span class="n">duration</span>
<span class="k">return</span> <span class="kt">CGFloat</span><span class="p">(</span> <span class="o">-</span><span class="mf">0.5</span> <span class="o">*</span> <span class="p">(</span><span class="nf">cos</span><span class="p">(</span><span class="kt">M_PI</span> <span class="o">*</span> <span class="n">position</span><span class="p">)</span> <span class="o">-</span> <span class="mf">1.0</span><span class="p">)</span> <span class="p">)</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseInExpo</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="nf">return</span> <span class="p">(</span><span class="n">elapsed</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">?</span> <span class="mf">0.0</span> <span class="p">:</span> <span class="kt">CGFloat</span><span class="p">(</span><span class="nf">pow</span><span class="p">(</span><span class="mf">2.0</span><span class="p">,</span> <span class="mf">10.0</span> <span class="o">*</span> <span class="p">(</span><span class="n">elapsed</span> <span class="o">/</span> <span class="n">duration</span> <span class="o">-</span> <span class="mf">1.0</span><span class="p">)))</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseOutExpo</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="nf">return</span> <span class="p">(</span><span class="n">elapsed</span> <span class="o">==</span> <span class="n">duration</span><span class="p">)</span> <span class="p">?</span> <span class="mf">1.0</span> <span class="p">:</span> <span class="p">(</span><span class="o">-</span><span class="kt">CGFloat</span><span class="p">(</span><span class="nf">pow</span><span class="p">(</span><span class="mf">2.0</span><span class="p">,</span> <span class="o">-</span><span class="mf">10.0</span> <span class="o">*</span> <span class="n">elapsed</span> <span class="o">/</span> <span class="n">duration</span><span class="p">))</span> <span class="o">+</span> <span class="mf">1.0</span><span class="p">)</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseInOutExpo</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">if</span> <span class="p">(</span><span class="n">elapsed</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="mf">0.0</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="n">elapsed</span> <span class="o">==</span> <span class="n">duration</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="mf">1.0</span>
<span class="p">}</span>
<span class="k">var</span> <span class="nv">position</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="n">elapsed</span> <span class="o">/</span> <span class="p">(</span><span class="n">duration</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">)</span>
<span class="k">if</span> <span class="p">(</span><span class="n">position</span> <span class="o"><</span> <span class="mf">1.0</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="kt">CGFloat</span><span class="p">(</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="nf">pow</span><span class="p">(</span><span class="mf">2.0</span><span class="p">,</span> <span class="mf">10.0</span> <span class="o">*</span> <span class="p">(</span><span class="n">position</span> <span class="o">-</span> <span class="mf">1.0</span><span class="p">))</span> <span class="p">)</span>
<span class="p">}</span>
<span class="k">return</span> <span class="kt">CGFloat</span><span class="p">(</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="p">(</span><span class="o">-</span><span class="nf">pow</span><span class="p">(</span><span class="mf">2.0</span><span class="p">,</span> <span class="o">-</span><span class="mf">10.0</span> <span class="o">*</span> <span class="o">--</span><span class="n">position</span><span class="p">)</span> <span class="o">+</span> <span class="mf">2.0</span><span class="p">)</span> <span class="p">)</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseInCirc</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">var</span> <span class="nv">position</span> <span class="o">=</span> <span class="kt">CGFloat</span><span class="p">(</span><span class="n">elapsed</span> <span class="o">/</span> <span class="n">duration</span><span class="p">)</span>
<span class="k">return</span> <span class="o">-</span><span class="p">(</span><span class="kt">CGFloat</span><span class="p">(</span><span class="nf">sqrt</span><span class="p">(</span><span class="mf">1.0</span> <span class="o">-</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span><span class="p">))</span> <span class="o">-</span> <span class="mf">1.0</span><span class="p">)</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseOutCirc</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">var</span> <span class="nv">position</span> <span class="o">=</span> <span class="kt">CGFloat</span><span class="p">(</span><span class="n">elapsed</span> <span class="o">/</span> <span class="n">duration</span><span class="p">)</span>
<span class="n">position</span><span class="o">--</span>
<span class="k">return</span> <span class="kt">CGFloat</span><span class="p">(</span> <span class="nf">sqrt</span><span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span><span class="p">)</span> <span class="p">)</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseInOutCirc</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">var</span> <span class="nv">position</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="n">elapsed</span> <span class="o">/</span> <span class="p">(</span><span class="n">duration</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">)</span>
<span class="k">if</span> <span class="p">(</span><span class="n">position</span> <span class="o"><</span> <span class="mf">1.0</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="kt">CGFloat</span><span class="p">(</span> <span class="o">-</span><span class="mf">0.5</span> <span class="o">*</span> <span class="p">(</span><span class="nf">sqrt</span><span class="p">(</span><span class="mf">1.0</span> <span class="o">-</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span><span class="p">)</span> <span class="o">-</span> <span class="mf">1.0</span><span class="p">)</span> <span class="p">)</span>
<span class="p">}</span>
<span class="n">position</span> <span class="o">-=</span> <span class="mf">2.0</span>
<span class="k">return</span> <span class="kt">CGFloat</span><span class="p">(</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="p">(</span><span class="nf">sqrt</span><span class="p">(</span><span class="mf">1.0</span> <span class="o">-</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span><span class="p">)</span> <span class="o">+</span> <span class="mf">1.0</span><span class="p">)</span> <span class="p">)</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseInElastic</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">if</span> <span class="p">(</span><span class="n">elapsed</span> <span class="o">==</span> <span class="mf">0.0</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="mf">0.0</span>
<span class="p">}</span>
<span class="k">var</span> <span class="nv">position</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="n">elapsed</span> <span class="o">/</span> <span class="n">duration</span>
<span class="k">if</span> <span class="p">(</span><span class="n">position</span> <span class="o">==</span> <span class="mf">1.0</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="mf">1.0</span>
<span class="p">}</span>
<span class="k">var</span> <span class="nv">p</span> <span class="o">=</span> <span class="n">duration</span> <span class="o">*</span> <span class="mf">0.3</span>
<span class="k">var</span> <span class="nv">s</span> <span class="o">=</span> <span class="n">p</span> <span class="o">/</span> <span class="p">(</span><span class="mf">2.0</span> <span class="o">*</span> <span class="kt">M_PI</span><span class="p">)</span> <span class="o">*</span> <span class="nf">asin</span><span class="p">(</span><span class="mf">1.0</span><span class="p">)</span>
<span class="n">position</span> <span class="o">-=</span> <span class="mf">1.0</span>
<span class="k">return</span> <span class="kt">CGFloat</span><span class="p">(</span> <span class="o">-</span><span class="p">(</span><span class="nf">pow</span><span class="p">(</span><span class="mf">2.0</span><span class="p">,</span> <span class="mf">10.0</span> <span class="o">*</span> <span class="n">position</span><span class="p">)</span> <span class="o">*</span> <span class="nf">sin</span><span class="p">((</span><span class="n">position</span> <span class="o">*</span> <span class="n">duration</span> <span class="o">-</span> <span class="n">s</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="mf">2.0</span> <span class="o">*</span> <span class="kt">M_PI</span><span class="p">)</span> <span class="o">/</span> <span class="n">p</span><span class="p">))</span> <span class="p">)</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseOutElastic</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">if</span> <span class="p">(</span><span class="n">elapsed</span> <span class="o">==</span> <span class="mf">0.0</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="mf">0.0</span>
<span class="p">}</span>
<span class="k">var</span> <span class="nv">position</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="n">elapsed</span> <span class="o">/</span> <span class="n">duration</span>
<span class="k">if</span> <span class="p">(</span><span class="n">position</span> <span class="o">==</span> <span class="mf">1.0</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="mf">1.0</span>
<span class="p">}</span>
<span class="k">var</span> <span class="nv">p</span> <span class="o">=</span> <span class="n">duration</span> <span class="o">*</span> <span class="mf">0.3</span>
<span class="k">var</span> <span class="nv">s</span> <span class="o">=</span> <span class="n">p</span> <span class="o">/</span> <span class="p">(</span><span class="mf">2.0</span> <span class="o">*</span> <span class="kt">M_PI</span><span class="p">)</span> <span class="o">*</span> <span class="nf">asin</span><span class="p">(</span><span class="mf">1.0</span><span class="p">)</span>
<span class="k">return</span> <span class="kt">CGFloat</span><span class="p">(</span> <span class="nf">pow</span><span class="p">(</span><span class="mf">2.0</span><span class="p">,</span> <span class="o">-</span><span class="mf">10.0</span> <span class="o">*</span> <span class="n">position</span><span class="p">)</span> <span class="o">*</span> <span class="nf">sin</span><span class="p">((</span><span class="n">position</span> <span class="o">*</span> <span class="n">duration</span> <span class="o">-</span> <span class="n">s</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="mf">2.0</span> <span class="o">*</span> <span class="kt">M_PI</span><span class="p">)</span> <span class="o">/</span> <span class="n">p</span><span class="p">)</span> <span class="o">+</span> <span class="mf">1.0</span> <span class="p">)</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseInOutElastic</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">if</span> <span class="p">(</span><span class="n">elapsed</span> <span class="o">==</span> <span class="mf">0.0</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="mf">0.0</span>
<span class="p">}</span>
<span class="k">var</span> <span class="nv">position</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="n">elapsed</span> <span class="o">/</span> <span class="p">(</span><span class="n">duration</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">)</span>
<span class="k">if</span> <span class="p">(</span><span class="n">position</span> <span class="o">==</span> <span class="mf">2.0</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="mf">1.0</span>
<span class="p">}</span>
<span class="k">var</span> <span class="nv">p</span> <span class="o">=</span> <span class="n">duration</span> <span class="o">*</span> <span class="p">(</span><span class="mf">0.3</span> <span class="o">*</span> <span class="mf">1.5</span><span class="p">)</span>
<span class="k">var</span> <span class="nv">s</span> <span class="o">=</span> <span class="n">p</span> <span class="o">/</span> <span class="p">(</span><span class="mf">2.0</span> <span class="o">*</span> <span class="kt">M_PI</span><span class="p">)</span> <span class="o">*</span> <span class="nf">asin</span><span class="p">(</span><span class="mf">1.0</span><span class="p">)</span>
<span class="k">if</span> <span class="p">(</span><span class="n">position</span> <span class="o"><</span> <span class="mf">1.0</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">position</span> <span class="o">-=</span> <span class="mf">1.0</span>
<span class="k">return</span> <span class="kt">CGFloat</span><span class="p">(</span> <span class="o">-</span><span class="mf">0.5</span> <span class="o">*</span> <span class="p">(</span><span class="nf">pow</span><span class="p">(</span><span class="mf">2.0</span><span class="p">,</span> <span class="mf">10.0</span> <span class="o">*</span> <span class="n">position</span><span class="p">)</span> <span class="o">*</span> <span class="nf">sin</span><span class="p">((</span><span class="n">position</span> <span class="o">*</span> <span class="n">duration</span> <span class="o">-</span> <span class="n">s</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="mf">2.0</span> <span class="o">*</span> <span class="kt">M_PI</span><span class="p">)</span> <span class="o">/</span> <span class="n">p</span><span class="p">))</span> <span class="p">)</span>
<span class="p">}</span>
<span class="n">position</span> <span class="o">-=</span> <span class="mf">1.0</span>
<span class="k">return</span> <span class="kt">CGFloat</span><span class="p">(</span> <span class="nf">pow</span><span class="p">(</span><span class="mf">2.0</span><span class="p">,</span> <span class="o">-</span><span class="mf">10.0</span> <span class="o">*</span> <span class="n">position</span><span class="p">)</span> <span class="o">*</span> <span class="nf">sin</span><span class="p">((</span><span class="n">position</span> <span class="o">*</span> <span class="n">duration</span> <span class="o">-</span> <span class="n">s</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="mf">2.0</span> <span class="o">*</span> <span class="kt">M_PI</span><span class="p">)</span> <span class="o">/</span> <span class="n">p</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.5</span> <span class="o">+</span> <span class="mf">1.0</span> <span class="p">)</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseInBack</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">let</span> <span class="nv">s</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="mf">1.70158</span>
<span class="k">var</span> <span class="nv">position</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="n">elapsed</span> <span class="o">/</span> <span class="n">duration</span>
<span class="k">return</span> <span class="kt">CGFloat</span><span class="p">(</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="p">((</span><span class="n">s</span> <span class="o">+</span> <span class="mf">1.0</span><span class="p">)</span> <span class="o">*</span> <span class="n">position</span> <span class="o">-</span> <span class="n">s</span><span class="p">)</span> <span class="p">)</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseOutBack</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">let</span> <span class="nv">s</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="mf">1.70158</span>
<span class="k">var</span> <span class="nv">position</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="n">elapsed</span> <span class="o">/</span> <span class="n">duration</span>
<span class="n">position</span><span class="o">--</span>
<span class="k">return</span> <span class="kt">CGFloat</span><span class="p">(</span> <span class="p">(</span><span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="p">((</span><span class="n">s</span> <span class="o">+</span> <span class="mf">1.0</span><span class="p">)</span> <span class="o">*</span> <span class="n">position</span> <span class="o">+</span> <span class="n">s</span><span class="p">)</span> <span class="o">+</span> <span class="mf">1.0</span><span class="p">)</span> <span class="p">)</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseInOutBack</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">var</span> <span class="nv">s</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="mf">1.70158</span>
<span class="k">var</span> <span class="nv">position</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="n">elapsed</span> <span class="o">/</span> <span class="p">(</span><span class="n">duration</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">)</span>
<span class="k">if</span> <span class="p">(</span><span class="n">position</span> <span class="o"><</span> <span class="mf">1.0</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">s</span> <span class="o">*=</span> <span class="mf">1.525</span>
<span class="k">return</span> <span class="kt">CGFloat</span><span class="p">(</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="p">(</span><span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="p">((</span><span class="n">s</span> <span class="o">+</span> <span class="mf">1.0</span><span class="p">)</span> <span class="o">*</span> <span class="n">position</span> <span class="o">-</span> <span class="n">s</span><span class="p">))</span> <span class="p">)</span>
<span class="p">}</span>
<span class="n">s</span> <span class="o">*=</span> <span class="mf">1.525</span>
<span class="n">position</span> <span class="o">-=</span> <span class="mf">2.0</span>
<span class="k">return</span> <span class="kt">CGFloat</span><span class="p">(</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="p">(</span><span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="p">((</span><span class="n">s</span> <span class="o">+</span> <span class="mf">1.0</span><span class="p">)</span> <span class="o">*</span> <span class="n">position</span> <span class="o">+</span> <span class="n">s</span><span class="p">)</span> <span class="o">+</span> <span class="mf">2.0</span><span class="p">)</span> <span class="p">)</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseInBounce</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">return</span> <span class="mf">1.0</span> <span class="o">-</span> <span class="kt">EaseOutBounce</span><span class="p">(</span><span class="n">duration</span> <span class="o">-</span> <span class="n">elapsed</span><span class="p">,</span> <span class="n">duration</span><span class="p">)</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseOutBounce</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">var</span> <span class="nv">position</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="n">elapsed</span> <span class="o">/</span> <span class="n">duration</span>
<span class="k">if</span> <span class="p">(</span><span class="n">position</span> <span class="o"><</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">/</span> <span class="mf">2.75</span><span class="p">))</span>
<span class="p">{</span>
<span class="k">return</span> <span class="kt">CGFloat</span><span class="p">(</span> <span class="mf">7.5625</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="p">)</span>
<span class="p">}</span>
<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">position</span> <span class="o"><</span> <span class="p">(</span><span class="mf">2.0</span> <span class="o">/</span> <span class="mf">2.75</span><span class="p">))</span>
<span class="p">{</span>
<span class="n">position</span> <span class="o">-=</span> <span class="p">(</span><span class="mf">1.5</span> <span class="o">/</span> <span class="mf">2.75</span><span class="p">)</span>
<span class="k">return</span> <span class="kt">CGFloat</span><span class="p">(</span> <span class="mf">7.5625</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">+</span> <span class="mf">0.75</span> <span class="p">)</span>
<span class="p">}</span>
<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">position</span> <span class="o"><</span> <span class="p">(</span><span class="mf">2.5</span> <span class="o">/</span> <span class="mf">2.75</span><span class="p">))</span>
<span class="p">{</span>
<span class="n">position</span> <span class="o">-=</span> <span class="p">(</span><span class="mf">2.25</span> <span class="o">/</span> <span class="mf">2.75</span><span class="p">)</span>
<span class="k">return</span> <span class="kt">CGFloat</span><span class="p">(</span> <span class="mf">7.5625</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">+</span> <span class="mf">0.9375</span> <span class="p">)</span>
<span class="p">}</span>
<span class="k">else</span>
<span class="p">{</span>
<span class="n">position</span> <span class="o">-=</span> <span class="p">(</span><span class="mf">2.625</span> <span class="o">/</span> <span class="mf">2.75</span><span class="p">)</span>
<span class="k">return</span> <span class="kt">CGFloat</span><span class="p">(</span> <span class="mf">7.5625</span> <span class="o">*</span> <span class="n">position</span> <span class="o">*</span> <span class="n">position</span> <span class="o">+</span> <span class="mf">0.984375</span> <span class="p">)</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="kd">internal</span> <span class="kd">static</span> <span class="k">let</span> <span class="nv">EaseInOutBounce</span> <span class="o">=</span> <span class="p">{</span> <span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span> <span class="o">-></span> <span class="kt">CGFloat</span> <span class="k">in</span>
<span class="k">if</span> <span class="p">(</span><span class="n">elapsed</span> <span class="o"><</span> <span class="p">(</span><span class="n">duration</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">))</span>
<span class="p">{</span>
<span class="k">return</span> <span class="kt">EaseInBounce</span><span class="p">(</span><span class="n">elapsed</span> <span class="o">*</span> <span class="mf">2.0</span><span class="p">,</span> <span class="n">duration</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.5</span>
<span class="p">}</span>
<span class="k">return</span> <span class="kt">EaseOutBounce</span><span class="p">(</span><span class="n">elapsed</span> <span class="o">*</span> <span class="mf">2.0</span> <span class="o">-</span> <span class="n">duration</span><span class="p">,</span> <span class="n">duration</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.5</span> <span class="o">+</span> <span class="mf">0.5</span>
<span class="p">}</span>
}
ChartAnimator
<span class="c1">/// Called when the Animator has stopped.</span>
<span class="c1">/// 动画结束时调用</span>
<span class="kd">func</span> <span class="nf">chartAnimatorStopped</span><span class="p">(</span><span class="nv">chartAnimator</span><span class="p">:</span> <span class="kt">ChartAnimator</span><span class="p">)</span>
}
public class ChartAnimator: NSObject { public weak var delegate: ChartAnimatorDelegate? public var updateBlock: (() -> Void)? public var stopBlock: (() -> Void)?
<span class="c1">/// the phase that is animated and influences the drawn values on the y-axis</span>
<span class="c1">/// x相位 影响y轴绘值</span>
<span class="kd">public</span> <span class="k">var</span> <span class="nv">phaseX</span><span class="p">:</span> <span class="kt">CGFloat</span> <span class="o">=</span> <span class="mf">1.0</span>
<span class="c1">/// the phase that is animated and influences the drawn values on the y-axis</span>
<span class="c1">/// y相位 影响y轴绘值</span>
<span class="kd">public</span> <span class="k">var</span> <span class="nv">phaseY</span><span class="p">:</span> <span class="kt">CGFloat</span> <span class="o">=</span> <span class="mf">1.0</span>
<span class="kd">private</span> <span class="k">var</span> <span class="nv">_startTime</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="kd">private</span> <span class="k">var</span> <span class="nv">_displayLink</span><span class="p">:</span> <span class="kt">CADisplayLink</span><span class="o">!</span>
<span class="kd">private</span> <span class="k">var</span> <span class="nv">_xDuration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="kd">private</span> <span class="k">var</span> <span class="nv">_yDuration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="kd">private</span> <span class="k">var</span> <span class="nv">_endTimeX</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="kd">private</span> <span class="k">var</span> <span class="nv">_endTimeY</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="kd">private</span> <span class="k">var</span> <span class="nv">_endTime</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="kd">private</span> <span class="k">var</span> <span class="nv">_enabledX</span><span class="p">:</span> <span class="kt">Bool</span> <span class="o">=</span> <span class="kc">false</span>
<span class="kd">private</span> <span class="k">var</span> <span class="nv">_enabledY</span><span class="p">:</span> <span class="kt">Bool</span> <span class="o">=</span> <span class="kc">false</span>
<span class="kd">private</span> <span class="k">var</span> <span class="nv">_easingX</span><span class="p">:</span> <span class="kt">ChartEasingFunctionBlock</span><span class="p">?</span>
<span class="kd">private</span> <span class="k">var</span> <span class="nv">_easingY</span><span class="p">:</span> <span class="kt">ChartEasingFunctionBlock</span><span class="p">?</span>
<span class="kd">public</span> <span class="k">override</span> <span class="nf">init</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">super</span><span class="o">.</span><span class="nf">init</span><span class="p">()</span>
<span class="p">}</span>
<span class="kd">deinit</span>
<span class="p">{</span>
<span class="nf">stop</span><span class="p">()</span>
<span class="p">}</span>
<span class="kd">public</span> <span class="kd">func</span> <span class="nf">stop</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">_displayLink</span> <span class="o">!=</span> <span class="kc">nil</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">_displayLink</span><span class="o">.</span><span class="nf">removeFromRunLoop</span><span class="p">(</span><span class="kt">NSRunLoop</span><span class="o">.</span><span class="nf">mainRunLoop</span><span class="p">(),</span> <span class="nv">forMode</span><span class="p">:</span> <span class="kt">NSRunLoopCommonModes</span><span class="p">)</span>
<span class="n">_displayLink</span> <span class="o">=</span> <span class="kc">nil</span>
<span class="n">_enabledX</span> <span class="o">=</span> <span class="kc">false</span>
<span class="n">_enabledY</span> <span class="o">=</span> <span class="kc">false</span>
<span class="k">if</span> <span class="p">(</span><span class="n">delegate</span> <span class="o">!=</span> <span class="kc">nil</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">delegate</span><span class="o">!.</span><span class="nf">chartAnimatorStopped</span><span class="p">(</span><span class="k">self</span><span class="p">)</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="n">stopBlock</span> <span class="o">!=</span> <span class="kc">nil</span><span class="p">)</span>
<span class="p">{</span>
<span class="nf">stopBlock</span><span class="p">?()</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="kd">private</span> <span class="kd">func</span> <span class="nf">updateAnimationPhases</span><span class="p">(</span><span class="nv">currentTime</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">var</span> <span class="nv">elapsedTime</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="n">currentTime</span> <span class="o">-</span> <span class="n">_startTime</span>
<span class="k">if</span> <span class="p">(</span><span class="n">_enabledX</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">var</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="n">_xDuration</span>
<span class="k">var</span> <span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="n">elapsedTime</span>
<span class="k">if</span> <span class="p">(</span><span class="n">elapsed</span> <span class="o">></span> <span class="n">duration</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">elapsed</span> <span class="o">=</span> <span class="n">duration</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="n">_easingX</span> <span class="o">!=</span> <span class="kc">nil</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">phaseX</span> <span class="o">=</span> <span class="nf">_easingX</span><span class="o">!</span><span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="n">elapsed</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="n">duration</span><span class="p">)</span>
<span class="p">}</span>
<span class="k">else</span>
<span class="p">{</span>
<span class="n">phaseX</span> <span class="o">=</span> <span class="kt">CGFloat</span><span class="p">(</span><span class="n">elapsed</span> <span class="o">/</span> <span class="n">duration</span><span class="p">)</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="n">_enabledY</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">var</span> <span class="nv">duration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="n">_yDuration</span>
<span class="k">var</span> <span class="nv">elapsed</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="n">elapsedTime</span>
<span class="k">if</span> <span class="p">(</span><span class="n">elapsed</span> <span class="o">></span> <span class="n">duration</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">elapsed</span> <span class="o">=</span> <span class="n">duration</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="n">_easingY</span> <span class="o">!=</span> <span class="kc">nil</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">phaseY</span> <span class="o">=</span> <span class="nf">_easingY</span><span class="o">!</span><span class="p">(</span><span class="nv">elapsed</span><span class="p">:</span> <span class="n">elapsed</span><span class="p">,</span> <span class="nv">duration</span><span class="p">:</span> <span class="n">duration</span><span class="p">)</span>
<span class="p">}</span>
<span class="k">else</span>
<span class="p">{</span>
<span class="n">phaseY</span> <span class="o">=</span> <span class="kt">CGFloat</span><span class="p">(</span><span class="n">elapsed</span> <span class="o">/</span> <span class="n">duration</span><span class="p">)</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="kd">@objc</span> <span class="kd">private</span> <span class="kd">func</span> <span class="nf">animationLoop</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">var</span> <span class="nv">currentTime</span><span class="p">:</span> <span class="kt">NSTimeInterval</span> <span class="o">=</span> <span class="kt">CACurrentMediaTime</span><span class="p">()</span>
<span class="nf">updateAnimationPhases</span><span class="p">(</span><span class="n">currentTime</span><span class="p">)</span>
<span class="k">if</span> <span class="p">(</span><span class="n">delegate</span> <span class="o">!=</span> <span class="kc">nil</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">delegate</span><span class="o">!.</span><span class="nf">chartAnimatorUpdated</span><span class="p">(</span><span class="k">self</span><span class="p">)</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="n">updateBlock</span> <span class="o">!=</span> <span class="kc">nil</span><span class="p">)</span>
<span class="p">{</span>
<span class="nf">updateBlock</span><span class="o">!</span><span class="p">()</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="n">currentTime</span> <span class="o">>=</span> <span class="n">_endTime</span><span class="p">)</span>
<span class="p">{</span>
<span class="nf">stop</span><span class="p">()</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="c1">/// Animates the drawing / rendering of the chart on both x- and y-axis with the specified animation time.</span>
<span class="c1">/// If animate(...) is called, no further calling of invalidate() is necessary to refresh the chart.</span>
<span class="c1">/// :param: xAxisDuration duration for animating the x axis</span>
<span class="c1">/// :param: yAxisDuration duration for animating the y axis</span>
<span class="c1">/// :param: easingX an easing function for the animation on the x axis</span>
<span class="c1">/// :param: easingY an easing function for the animation on the y axis</span>
<span class="kd">public</span> <span class="kd">func</span> <span class="nf">animate</span><span class="p">(</span><span class="nv">#xAxisDuration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">yAxisDuration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">easingX</span><span class="p">:</span> <span class="kt">ChartEasingFunctionBlock</span><span class="p">?,</span> <span class="nv">easingY</span><span class="p">:</span> <span class="kt">ChartEasingFunctionBlock</span><span class="p">?)</span>
<span class="p">{</span>
<span class="nf">stop</span><span class="p">()</span>
<span class="n">_displayLink</span> <span class="o">=</span> <span class="kt">CADisplayLink</span><span class="p">(</span><span class="nv">target</span><span class="p">:</span> <span class="k">self</span><span class="p">,</span> <span class="nv">selector</span><span class="p">:</span> <span class="kt">Selector</span><span class="p">(</span><span class="s">"animationLoop"</span><span class="p">))</span>
<span class="n">_startTime</span> <span class="o">=</span> <span class="kt">CACurrentMediaTime</span><span class="p">()</span>
<span class="n">_xDuration</span> <span class="o">=</span> <span class="n">xAxisDuration</span>
<span class="n">_yDuration</span> <span class="o">=</span> <span class="n">yAxisDuration</span>
<span class="n">_endTimeX</span> <span class="o">=</span> <span class="n">_startTime</span> <span class="o">+</span> <span class="n">xAxisDuration</span>
<span class="n">_endTimeY</span> <span class="o">=</span> <span class="n">_startTime</span> <span class="o">+</span> <span class="n">yAxisDuration</span>
<span class="n">_endTime</span> <span class="o">=</span> <span class="n">_endTimeX</span> <span class="o">></span> <span class="n">_endTimeY</span> <span class="p">?</span> <span class="nv">_endTimeX</span> <span class="p">:</span> <span class="n">_endTimeY</span>
<span class="n">_enabledX</span> <span class="o">=</span> <span class="n">xAxisDuration</span> <span class="o">></span> <span class="mf">0.0</span>
<span class="n">_enabledY</span> <span class="o">=</span> <span class="n">yAxisDuration</span> <span class="o">></span> <span class="mf">0.0</span>
<span class="n">_easingX</span> <span class="o">=</span> <span class="n">easingX</span>
<span class="n">_easingY</span> <span class="o">=</span> <span class="n">easingY</span>
<span class="c1">// Take care of the first frame if rendering is already scheduled...</span>
<span class="nf">updateAnimationPhases</span><span class="p">(</span><span class="n">_startTime</span><span class="p">)</span>
<span class="k">if</span> <span class="p">(</span><span class="n">_enabledX</span> <span class="o">||</span> <span class="n">_enabledY</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">_displayLink</span><span class="o">.</span><span class="nf">addToRunLoop</span><span class="p">(</span><span class="kt">NSRunLoop</span><span class="o">.</span><span class="nf">mainRunLoop</span><span class="p">(),</span> <span class="nv">forMode</span><span class="p">:</span> <span class="kt">NSRunLoopCommonModes</span><span class="p">)</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="c1">/// Animates the drawing / rendering of the chart on both x- and y-axis with the specified animation time.</span>
<span class="c1">/// If animate(...) is called, no further calling of invalidate() is necessary to refresh the chart.</span>
<span class="c1">/// :param: xAxisDuration duration for animating the x axis</span>
<span class="c1">/// :param: yAxisDuration duration for animating the y axis</span>
<span class="c1">/// :param: easingOptionX the easing function for the animation on the x axis</span>
<span class="c1">/// :param: easingOptionY the easing function for the animation on the y axis</span>
<span class="kd">public</span> <span class="kd">func</span> <span class="nf">animate</span><span class="p">(</span><span class="nv">#xAxisDuration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">yAxisDuration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">easingOptionX</span><span class="p">:</span> <span class="kt">ChartEasingOption</span><span class="p">,</span> <span class="nv">easingOptionY</span><span class="p">:</span> <span class="kt">ChartEasingOption</span><span class="p">)</span>
<span class="p">{</span>
<span class="nf">animate</span><span class="p">(</span><span class="nv">xAxisDuration</span><span class="p">:</span> <span class="n">xAxisDuration</span><span class="p">,</span> <span class="nv">yAxisDuration</span><span class="p">:</span> <span class="n">yAxisDuration</span><span class="p">,</span> <span class="nv">easingX</span><span class="p">:</span> <span class="nf">easingFunctionFromOption</span><span class="p">(</span><span class="n">easingOptionX</span><span class="p">),</span> <span class="nv">easingY</span><span class="p">:</span> <span class="nf">easingFunctionFromOption</span><span class="p">(</span><span class="n">easingOptionY</span><span class="p">))</span>
<span class="p">}</span>
<span class="c1">/// Animates the drawing / rendering of the chart on both x- and y-axis with the specified animation time.</span>
<span class="c1">/// If animate(...) is called, no further calling of invalidate() is necessary to refresh the chart.</span>
<span class="c1">/// :param: xAxisDuration duration for animating the x axis</span>
<span class="c1">/// :param: yAxisDuration duration for animating the y axis</span>
<span class="c1">/// :param: easing an easing function for the animation</span>
<span class="kd">public</span> <span class="kd">func</span> <span class="nf">animate</span><span class="p">(</span><span class="nv">#xAxisDuration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">yAxisDuration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">easing</span><span class="p">:</span> <span class="kt">ChartEasingFunctionBlock</span><span class="p">?)</span>
<span class="p">{</span>
<span class="nf">animate</span><span class="p">(</span><span class="nv">xAxisDuration</span><span class="p">:</span> <span class="n">xAxisDuration</span><span class="p">,</span> <span class="nv">yAxisDuration</span><span class="p">:</span> <span class="n">yAxisDuration</span><span class="p">,</span> <span class="nv">easingX</span><span class="p">:</span> <span class="n">easing</span><span class="p">,</span> <span class="nv">easingY</span><span class="p">:</span> <span class="n">easing</span><span class="p">)</span>
<span class="p">}</span>
<span class="c1">/// Animates the drawing / rendering of the chart on both x- and y-axis with the specified animation time.</span>
<span class="c1">/// If animate(...) is called, no further calling of invalidate() is necessary to refresh the chart.</span>
<span class="c1">/// :param: xAxisDuration duration for animating the x axis</span>
<span class="c1">/// :param: yAxisDuration duration for animating the y axis</span>
<span class="c1">/// :param: easingOption the easing function for the animation</span>
<span class="kd">public</span> <span class="kd">func</span> <span class="nf">animate</span><span class="p">(</span><span class="nv">#xAxisDuration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">yAxisDuration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">easingOption</span><span class="p">:</span> <span class="kt">ChartEasingOption</span><span class="p">)</span>
<span class="p">{</span>
<span class="nf">animate</span><span class="p">(</span><span class="nv">xAxisDuration</span><span class="p">:</span> <span class="n">xAxisDuration</span><span class="p">,</span> <span class="nv">yAxisDuration</span><span class="p">:</span> <span class="n">yAxisDuration</span><span class="p">,</span> <span class="nv">easing</span><span class="p">:</span> <span class="nf">easingFunctionFromOption</span><span class="p">(</span><span class="n">easingOption</span><span class="p">))</span>
<span class="p">}</span>
<span class="c1">/// Animates the drawing / rendering of the chart on both x- and y-axis with the specified animation time.</span>
<span class="c1">/// If animate(...) is called, no further calling of invalidate() is necessary to refresh the chart.</span>
<span class="c1">/// :param: xAxisDuration duration for animating the x axis</span>
<span class="c1">/// :param: yAxisDuration duration for animating the y axis</span>
<span class="kd">public</span> <span class="kd">func</span> <span class="nf">animate</span><span class="p">(</span><span class="nv">#xAxisDuration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">yAxisDuration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span>
<span class="p">{</span>
<span class="nf">animate</span><span class="p">(</span><span class="nv">xAxisDuration</span><span class="p">:</span> <span class="n">xAxisDuration</span><span class="p">,</span> <span class="nv">yAxisDuration</span><span class="p">:</span> <span class="n">yAxisDuration</span><span class="p">,</span> <span class="nv">easingOption</span><span class="p">:</span> <span class="o">.</span><span class="kt">EaseInOutSine</span><span class="p">)</span>
<span class="p">}</span>
<span class="c1">/// Animates the drawing / rendering of the chart the x-axis with the specified animation time.</span>
<span class="c1">/// If animate(...) is called, no further calling of invalidate() is necessary to refresh the chart.</span>
<span class="c1">/// :param: xAxisDuration duration for animating the x axis</span>
<span class="c1">/// :param: easing an easing function for the animation</span>
<span class="kd">public</span> <span class="kd">func</span> <span class="nf">animate</span><span class="p">(</span><span class="nv">#xAxisDuration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">easing</span><span class="p">:</span> <span class="kt">ChartEasingFunctionBlock</span><span class="p">?)</span>
<span class="p">{</span>
<span class="nf">animate</span><span class="p">(</span><span class="nv">xAxisDuration</span><span class="p">:</span> <span class="n">xAxisDuration</span><span class="p">,</span> <span class="nv">yAxisDuration</span><span class="p">:</span> <span class="mf">0.0</span><span class="p">,</span> <span class="nv">easing</span><span class="p">:</span> <span class="n">easing</span><span class="p">)</span>
<span class="p">}</span>
<span class="c1">/// Animates the drawing / rendering of the chart the x-axis with the specified animation time.</span>
<span class="c1">/// If animate(...) is called, no further calling of invalidate() is necessary to refresh the chart.</span>
<span class="c1">/// :param: xAxisDuration duration for animating the x axis</span>
<span class="c1">/// :param: easingOption the easing function for the animation</span>
<span class="kd">public</span> <span class="kd">func</span> <span class="nf">animate</span><span class="p">(</span><span class="nv">#xAxisDuration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">easingOption</span><span class="p">:</span> <span class="kt">ChartEasingOption</span><span class="p">)</span>
<span class="p">{</span>
<span class="nf">animate</span><span class="p">(</span><span class="nv">xAxisDuration</span><span class="p">:</span> <span class="n">xAxisDuration</span><span class="p">,</span> <span class="nv">yAxisDuration</span><span class="p">:</span> <span class="mf">0.0</span><span class="p">,</span> <span class="nv">easing</span><span class="p">:</span> <span class="nf">easingFunctionFromOption</span><span class="p">(</span><span class="n">easingOption</span><span class="p">))</span>
<span class="p">}</span>
<span class="c1">/// Animates the drawing / rendering of the chart the x-axis with the specified animation time.</span>
<span class="c1">/// If animate(...) is called, no further calling of invalidate() is necessary to refresh the chart.</span>
<span class="c1">/// :param: xAxisDuration duration for animating the x axis</span>
<span class="kd">public</span> <span class="kd">func</span> <span class="nf">animate</span><span class="p">(</span><span class="nv">#xAxisDuration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span>
<span class="p">{</span>
<span class="nf">animate</span><span class="p">(</span><span class="nv">xAxisDuration</span><span class="p">:</span> <span class="n">xAxisDuration</span><span class="p">,</span> <span class="nv">yAxisDuration</span><span class="p">:</span> <span class="mf">0.0</span><span class="p">,</span> <span class="nv">easingOption</span><span class="p">:</span> <span class="o">.</span><span class="kt">EaseInOutSine</span><span class="p">)</span>
<span class="p">}</span>
<span class="c1">/// Animates the drawing / rendering of the chart the y-axis with the specified animation time.</span>
<span class="c1">/// If animate(...) is called, no further calling of invalidate() is necessary to refresh the chart.</span>
<span class="c1">/// :param: yAxisDuration duration for animating the y axis</span>
<span class="c1">/// :param: easing an easing function for the animation</span>
<span class="kd">public</span> <span class="kd">func</span> <span class="nf">animate</span><span class="p">(</span><span class="nv">#yAxisDuration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">easing</span><span class="p">:</span> <span class="kt">ChartEasingFunctionBlock</span><span class="p">?)</span>
<span class="p">{</span>
<span class="nf">animate</span><span class="p">(</span><span class="nv">xAxisDuration</span><span class="p">:</span> <span class="mf">0.0</span><span class="p">,</span> <span class="nv">yAxisDuration</span><span class="p">:</span> <span class="n">yAxisDuration</span><span class="p">,</span> <span class="nv">easing</span><span class="p">:</span> <span class="n">easing</span><span class="p">)</span>
<span class="p">}</span>
<span class="c1">/// Animates the drawing / rendering of the chart the y-axis with the specified animation time.</span>
<span class="c1">/// If animate(...) is called, no further calling of invalidate() is necessary to refresh the chart.</span>
<span class="c1">/// :param: yAxisDuration duration for animating the y axis</span>
<span class="c1">/// :param: easingOption the easing function for the animation</span>
<span class="kd">public</span> <span class="kd">func</span> <span class="nf">animate</span><span class="p">(</span><span class="nv">#yAxisDuration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">,</span> <span class="nv">easingOption</span><span class="p">:</span> <span class="kt">ChartEasingOption</span><span class="p">)</span>
<span class="p">{</span>
<span class="nf">animate</span><span class="p">(</span><span class="nv">xAxisDuration</span><span class="p">:</span> <span class="mf">0.0</span><span class="p">,</span> <span class="nv">yAxisDuration</span><span class="p">:</span> <span class="n">yAxisDuration</span><span class="p">,</span> <span class="nv">easing</span><span class="p">:</span> <span class="nf">easingFunctionFromOption</span><span class="p">(</span><span class="n">easingOption</span><span class="p">))</span>
<span class="p">}</span>
<span class="c1">/// Animates the drawing / rendering of the chart the y-axis with the specified animation time.</span>
<span class="c1">/// If animate(...) is called, no further calling of invalidate() is necessary to refresh the chart.</span>
<span class="c1">/// :param: yAxisDuration duration for animating the y axis</span>
<span class="kd">public</span> <span class="kd">func</span> <span class="nf">animate</span><span class="p">(</span><span class="nv">#yAxisDuration</span><span class="p">:</span> <span class="kt">NSTimeInterval</span><span class="p">)</span>
<span class="p">{</span>
<span class="nf">animate</span><span class="p">(</span><span class="nv">xAxisDuration</span><span class="p">:</span> <span class="mf">0.0</span><span class="p">,</span> <span class="nv">yAxisDuration</span><span class="p">:</span> <span class="n">yAxisDuration</span><span class="p">,</span> <span class="nv">easingOption</span><span class="p">:</span> <span class="o">.</span><span class="kt">EaseInOutSine</span><span class="p">)</span>
<span class="p">}</span>
}