ActivityIndicatorAnimationSquareSpin.swift 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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 ActivityIndicatorAnimationSquareSpin: ActivityIndicatorAnimating {
  7. // MARK: Properties
  8. fileprivate let duration: CFTimeInterval = 3
  9. // MARK: ActivityIndicatorAnimating
  10. public func configureAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
  11. let square = ActivityIndicatorShape.rectangle.makeLayer(size: size, color: color)
  12. let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,
  13. y: (layer.bounds.size.height - size.height) / 2,
  14. width: size.width,
  15. height: size.height)
  16. square.frame = frame
  17. square.add(defaultAnimation, forKey: "animation")
  18. layer.addSublayer(square)
  19. }
  20. }
  21. // MARK: - Setup
  22. private extension ActivityIndicatorAnimationSquareSpin {
  23. var defaultAnimation: CAKeyframeAnimation {
  24. let timingFunction = CAMediaTimingFunction(controlPoints: 0.09, 0.57, 0.49, 0.9)
  25. let animation = CAKeyframeAnimation(keyPath: .transform)
  26. animation.keyTimes = [0, 0.25, 0.5, 0.75, 1]
  27. animation.timingFunctions = [timingFunction, timingFunction, timingFunction, timingFunction]
  28. animation.values = [
  29. NSValue(caTransform3D: CATransform3DConcat(makeRotateXTransform(angle: 0), makeRotateYTransform(angle: 0))),
  30. NSValue(caTransform3D: CATransform3DConcat(makeRotateXTransform(angle: CGFloat.pi), makeRotateYTransform(angle: 0))),
  31. NSValue(caTransform3D: CATransform3DConcat(makeRotateXTransform(angle: CGFloat.pi), makeRotateYTransform(angle: CGFloat.pi))),
  32. NSValue(caTransform3D: CATransform3DConcat(makeRotateXTransform(angle: 0), makeRotateYTransform(angle: CGFloat.pi))),
  33. NSValue(caTransform3D: CATransform3DConcat(makeRotateXTransform(angle: 0), makeRotateYTransform(angle: 0)))]
  34. animation.duration = duration
  35. animation.repeatCount = .infinity
  36. animation.isRemovedOnCompletion = false
  37. return animation
  38. }
  39. func makeRotateXTransform(angle: CGFloat) -> CATransform3D {
  40. var transform = CATransform3DMakeRotation(angle, 1, 0, 0)
  41. transform.m34 = CGFloat(-1) / 100
  42. return transform
  43. }
  44. func makeRotateYTransform(angle: CGFloat) -> CATransform3D {
  45. var transform = CATransform3DMakeRotation(angle, 0, 1, 0)
  46. transform.m34 = CGFloat(-1) / 100
  47. return transform
  48. }
  49. }