ActivityIndicatorAnimationBallScaleRipple.swift 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. //
  2. // Created by Tom Baranes on 23/08/16.
  3. // Copyright (c) 2016 IBAnimatable. All rights reserved.
  4. //
  5. import UIKit
  6. public class ActivityIndicatorAnimationBallScaleRipple: ActivityIndicatorAnimating {
  7. // MARK: Properties
  8. fileprivate let duration: CFTimeInterval = 1
  9. fileprivate let timingFunction = CAMediaTimingFunction(controlPoints: 0.21, 0.53, 0.56, 0.8)
  10. // MARK: ActivityIndicatorAnimating
  11. public func configureAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
  12. let circle = ActivityIndicatorShape.ring.makeLayer(size: size, color: color)
  13. let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,
  14. y: (layer.bounds.size.height - size.height) / 2,
  15. width: size.width,
  16. height: size.height)
  17. circle.frame = frame
  18. circle.add(animation, forKey: "animation")
  19. layer.addSublayer(circle)
  20. }
  21. }
  22. // MARK: - Setup
  23. private extension ActivityIndicatorAnimationBallScaleRipple {
  24. var animation: CAAnimationGroup {
  25. let animation = CAAnimationGroup()
  26. animation.animations = [scaleAnimation, opacityAnimation]
  27. animation.duration = duration
  28. animation.repeatCount = .infinity
  29. animation.isRemovedOnCompletion = false
  30. return animation
  31. }
  32. var scaleAnimation: CAKeyframeAnimation {
  33. let scaleAnimation = CAKeyframeAnimation(keyPath: .scale)
  34. scaleAnimation.keyTimes = [0, 0.7]
  35. scaleAnimation.timingFunction = timingFunction
  36. scaleAnimation.values = [0.1, 1]
  37. scaleAnimation.duration = duration
  38. return scaleAnimation
  39. }
  40. var opacityAnimation: CAKeyframeAnimation {
  41. let opacityAnimation = CAKeyframeAnimation(keyPath: .opacity)
  42. opacityAnimation.keyTimes = [0, 0.7, 1]
  43. opacityAnimation.timingFunctions = [timingFunction, timingFunction]
  44. opacityAnimation.values = [1, 0.7, 0]
  45. opacityAnimation.duration = duration
  46. return opacityAnimation
  47. }
  48. }