RadialGradientLayer.swift 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. //
  2. // RadialGradientLayer.swift
  3. // IBAnimatable
  4. //
  5. // Created by Tom Baranes on 08/01/2018.
  6. // Copyright © 2018 IBAnimatable. All rights reserved.
  7. //
  8. import UIKit
  9. final class RadialGradientLayer: CALayer {
  10. var startPoint: CGPoint = .zero
  11. var endPoint: CGPoint = .zero
  12. var colors = [CGColor]()
  13. required override init() {
  14. super.init()
  15. needsDisplayOnBoundsChange = true
  16. }
  17. required init(coder aDecoder: NSCoder) {
  18. super.init()
  19. }
  20. override func draw(in ctx: CGContext) {
  21. ctx.saveGState()
  22. let colorSpace = CGColorSpaceCreateDeviceRGB()
  23. guard !colors.isEmpty, let gradient = CGGradient(colorsSpace: colorSpace, colors: colors as CFArray, locations: [0, 1]) else {
  24. return
  25. }
  26. let startCenter = CGPoint(x: bounds.width * startPoint.x,
  27. y: bounds.height * startPoint.y)
  28. let endCenter = CGPoint(x: bounds.width * endPoint.x,
  29. y: bounds.height * endPoint.y)
  30. let endRadius = max(max(frame.size.width - endPoint.x, endPoint.x), max(frame.size.height - endPoint.y, endPoint.y))
  31. ctx.drawRadialGradient(gradient,
  32. startCenter: startCenter,
  33. startRadius: 0,
  34. endCenter: endCenter,
  35. endRadius: endRadius,
  36. options: .drawsAfterEndLocation)
  37. }
  38. }