Blame view

HDFwear/Basic/LoadingButton/LoaderCircleChaseAnimation.swift 2.3 KB
f2cf74c7   yangbin   1.0.20(4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
  //
  //  LoaderCircleStrokeAnimation.swift
  //  LoaderButton
  //
  //  Created by 黄进文 on 2018/6/11.
  //  Copyright © 2018 Jovins. All rights reserved.
  //
  
  import UIKit
  
  class LoaderCircleChaseAnimation: LoaderButtonAnimationDelegate {
  
      /// Setup Loader Layer
      ///
      /// - Parameters:
      /// - layer: layer Parent layer (Button layer)
      /// - frame: frame of parant layer
      /// - color: color of Loader
      func setupLoaderButtonAnimation(layer: CALayer, frame: CGRect, color: UIColor) {
  
          let padding: CGFloat = 10.0
          let sizeValue = max(min(frame.width, frame.height) - padding, 1.0)
  
          let beginTime: Double = 0.5
          let strokeStartDuration: Double = 1.2
          let strokeEndDuration: Double = 0.7
  
          /// Animation
          let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation")
          rotationAnimation.byValue = Float.pi * 2
          rotationAnimation.timingFunction = CAMediaTimingFunction(name: .linear)
  
          let strokeEndAnimation = CABasicAnimation(keyPath: "strokeEnd")
          strokeEndAnimation.duration = strokeEndDuration
          strokeEndAnimation.timingFunction = CAMediaTimingFunction(controlPoints: 0.4, 0.0, 0.2, 1.0)
          strokeEndAnimation.fromValue = 0
          strokeEndAnimation.toValue = 1
  
          let strokeStartAnimation = CABasicAnimation(keyPath: "strokeStart")
          strokeStartAnimation.duration = strokeStartDuration
          strokeStartAnimation.timingFunction = CAMediaTimingFunction(controlPoints: 0.4, 0.2, 0.0, 1.0)
          strokeStartAnimation.fromValue = 0
          strokeStartAnimation.toValue = 1
          strokeStartAnimation.beginTime = beginTime
  
          let groupAnimation = CAAnimationGroup()
          groupAnimation.animations = [rotationAnimation, strokeEndAnimation, strokeStartAnimation]
          groupAnimation.duration = strokeStartDuration + beginTime
          groupAnimation.repeatCount = .infinity
          groupAnimation.isRemovedOnCompletion = false
          groupAnimation.fillMode = .forwards
  
          let circle = LoaderShape.stroke.layer(with: CGSize(width: sizeValue, height: sizeValue), color: color)
          let frame = CGRect(x: padding * 0.5, y: padding * 0.5, width: sizeValue, height: sizeValue)
          circle.frame = frame
          circle.add(groupAnimation, forKey: "animation")
          layer.addSublayer(circle)
      }
  }