ActivityIndicatorAnimationTriangleSkewSpin.swift 2.3 KB

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