Advertisement
Guest User

Untitled

a guest
Sep 15th, 2019
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.68 KB | None | 0 0
  1. import UIKit
  2.  
  3. extension Comparable {
  4. func clamping(_ range: ClosedRange<Self>) -> Self {
  5. return Swift.min(range.upperBound, max(range.lowerBound, self))
  6. }
  7. }
  8.  
  9. extension UIColor {
  10. func components() -> (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
  11. var red, green, blue, alpha: CGFloat
  12. (red, green, blue, alpha) = (0, 0, 0, 0)
  13. getRed(&red, green: &green, blue: &blue, alpha: &alpha)
  14. return (red, green, blue, alpha)
  15. }
  16. }
  17.  
  18. struct ColorInterpolation {
  19. let values: [UIColor]
  20.  
  21. init(start: UIColor, end: UIColor, stepsCount: Int) {
  22. guard stepsCount > 2 else {
  23. values = [start, end]
  24. return
  25. }
  26. let startComponents = start.components()
  27. let endComponents = end.components()
  28. values = [start]
  29. + (1..<(stepsCount - 1)).map { step in
  30. let factor = CGFloat(step) / CGFloat(stepsCount)
  31. return UIColor(red: startComponents.red + (endComponents.red - startComponents.red) * factor,
  32. green: startComponents.green + (endComponents.green - startComponents.green) * factor,
  33. blue: startComponents.blue + (endComponents.blue - startComponents.blue) * factor,
  34. alpha: startComponents.alpha + (endComponents.alpha - startComponents.alpha) * factor)
  35. }
  36. + [end]
  37. }
  38.  
  39. subscript(factor: CGFloat) -> UIColor {
  40. let cfactor = factor.clamping(0...1)
  41. let findex = cfactor * CGFloat(values.count) - 0.5
  42. let rindex = Int(findex.rounded(.towardZero)).clamping(0...values.endIndex - 1)
  43. return values[rindex]
  44. }
  45. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement