UIColor+Extensions.swift 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. //
  2. // UIColor+adjust.swift
  3. // Nextcloud
  4. //
  5. // Created by Marino Faggiana on 04/02/2020.
  6. // Copyright © 2020 Marino Faggiana. All rights reserved.
  7. //
  8. import Foundation
  9. extension UIColor {
  10. @objc convenience init?(hex: String) {
  11. let r, g, b, a: CGFloat
  12. if hex.hasPrefix("#") {
  13. let start = hex.index(hex.startIndex, offsetBy: 1)
  14. let hexColor = String(hex[start...])
  15. let scanner = Scanner(string: hexColor)
  16. var hexNumber: UInt64 = 0
  17. if hexColor.count == 6 && scanner.scanHexInt64(&hexNumber) {
  18. r = CGFloat((hexNumber & 0xff0000) >> 16) / 255.0
  19. g = CGFloat((hexNumber & 0x00ff00) >> 8) / 255.0
  20. b = CGFloat(hexNumber & 0x0000ff) / 255.0
  21. self.init(red: r, green: g, blue: b, alpha: 1)
  22. return
  23. } else if hexColor.count == 7 && scanner.scanHexInt64(&hexNumber) {
  24. r = CGFloat((hexNumber & 0xff000000) >> 24) / 255
  25. g = CGFloat((hexNumber & 0x00ff0000) >> 16) / 255
  26. b = CGFloat((hexNumber & 0x0000ff00) >> 8) / 255
  27. a = CGFloat(hexNumber & 0x000000ff) / 255
  28. self.init(red: r, green: g, blue: b, alpha: a)
  29. return
  30. }
  31. }
  32. return nil
  33. }
  34. @objc func lighter(by percentage: CGFloat = 30.0) -> UIColor? {
  35. return self.adjust(by: abs(percentage) )
  36. }
  37. @objc func darker(by percentage: CGFloat = 30.0) -> UIColor? {
  38. return self.adjust(by: -1 * abs(percentage) )
  39. }
  40. func adjust(by percentage: CGFloat = 30.0) -> UIColor? {
  41. var red: CGFloat = 0, green: CGFloat = 0, blue: CGFloat = 0, alpha: CGFloat = 0
  42. if self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) {
  43. return UIColor(red: min(red + percentage/100, 1.0),
  44. green: min(green + percentage/100, 1.0),
  45. blue: min(blue + percentage/100, 1.0),
  46. alpha: alpha)
  47. } else {
  48. return nil
  49. }
  50. }
  51. @objc func isTooLight() -> Bool {
  52. var white: CGFloat = 0.0
  53. self.getWhite(&white, alpha: nil)
  54. if white == 1 { return true }
  55. guard let components = cgColor.components, components.count > 2 else {return false}
  56. let brightness = ((components[0] * 299) + (components[1] * 587) + (components[2] * 114)) / 1000
  57. return (brightness > 0.95)
  58. }
  59. @objc func isTooDark() -> Bool {
  60. var white: CGFloat = 0.0
  61. self.getWhite(&white, alpha: nil)
  62. if white == 0 { return true }
  63. guard let components = cgColor.components, components.count > 2 else {return false}
  64. let brightness = ((components[0] * 299) + (components[1] * 587) + (components[2] * 114)) / 1000
  65. return (brightness < 0.05)
  66. }
  67. func isLight(threshold: Float = 0.7) -> Bool {
  68. let originalCGColor = self.cgColor
  69. // Now we need to convert it to the RGB colorspace. UIColor.white / UIColor.black are greyscale and not RGB.
  70. // If you don't do this then you will crash when accessing components index 2 below when evaluating greyscale colors.
  71. let RGBCGColor = originalCGColor.converted(to: CGColorSpaceCreateDeviceRGB(), intent: .defaultIntent, options: nil)
  72. guard let components = RGBCGColor?.components else { return false }
  73. guard components.count >= 3 else { return false }
  74. let brightness = Float(((components[0] * 299) + (components[1] * 587) + (components[2] * 114)) / 1000)
  75. return (brightness > threshold)
  76. }
  77. }