// // UIColor+Extension.swift // Nextcloud // // Created by Marino Faggiana on 04/02/2020. // Copyright © 2020 Marino Faggiana. All rights reserved. // // Author Marino Faggiana // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // import Foundation import UIKit extension UIColor { var inverted: UIColor { var r: CGFloat = 0.0, g: CGFloat = 0.0, b: CGFloat = 0.0, a: CGFloat = 0.0 self.getRed(&r, green: &g, blue: &b, alpha: &a) return UIColor(red: (1 - r), green: (1 - g), blue: (1 - b), alpha: a) // Assuming you want the same alpha value. } var hexString: String { let cgColorInRGB = cgColor.converted(to: CGColorSpace(name: CGColorSpace.sRGB)!, intent: .defaultIntent, options: nil)! let colorRef = cgColorInRGB.components let r = colorRef?[0] ?? 0 let g = colorRef?[1] ?? 0 let b = ((colorRef?.count ?? 0) > 2 ? colorRef?[2] : g) ?? 0 let a = cgColor.alpha var color = String( format: "#%02lX%02lX%02lX", lroundf(Float(r * 255)), lroundf(Float(g * 255)), lroundf(Float(b * 255)) ) if a < 1 { color += String(format: "%02lX", lroundf(Float(a * 255))) } return color } @objc convenience init?(hex: String) { let r, g, b, a: CGFloat if hex.hasPrefix("#") { let start = hex.index(hex.startIndex, offsetBy: 1) let hexColor = String(hex[start...]) let scanner = Scanner(string: hexColor) var hexNumber: UInt64 = 0 if hexColor.count == 6 && scanner.scanHexInt64(&hexNumber) { r = CGFloat((hexNumber & 0xff0000) >> 16) / 255.0 g = CGFloat((hexNumber & 0x00ff00) >> 8) / 255.0 b = CGFloat(hexNumber & 0x0000ff) / 255.0 self.init(red: r, green: g, blue: b, alpha: 1) return } else if hexColor.count == 7 && scanner.scanHexInt64(&hexNumber) { r = CGFloat((hexNumber & 0xff000000) >> 24) / 255 g = CGFloat((hexNumber & 0x00ff0000) >> 16) / 255 b = CGFloat((hexNumber & 0x0000ff00) >> 8) / 255 a = CGFloat(hexNumber & 0x000000ff) / 255 self.init(red: r, green: g, blue: b, alpha: a) return } } return nil } @objc func lighter(by percentage: CGFloat = 30.0) -> UIColor? { return self.adjust(by: abs(percentage) ) } @objc func darker(by percentage: CGFloat = 30.0) -> UIColor? { return self.adjust(by: -1 * abs(percentage) ) } func adjust(by percentage: CGFloat = 30.0) -> UIColor? { var red: CGFloat = 0, green: CGFloat = 0, blue: CGFloat = 0, alpha: CGFloat = 0 if self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) { return UIColor(red: min(red + percentage / 100, 1.0), green: min(green + percentage / 100, 1.0), blue: min(blue + percentage / 100, 1.0), alpha: alpha) } else { return nil } } @objc func isTooLight() -> Bool { var white: CGFloat = 0.0 self.getWhite(&white, alpha: nil) if white == 1 { return true } guard let components = cgColor.components, components.count > 2 else {return false} let brightness = ((components[0] * 299) + (components[1] * 587) + (components[2] * 114)) / 1000 return (brightness > 0.90) } @objc func isTooDark() -> Bool { var white: CGFloat = 0.0 self.getWhite(&white, alpha: nil) if white == 0 { return true } guard let components = cgColor.components, components.count > 2 else {return false} let brightness = ((components[0] * 299) + (components[1] * 587) + (components[2] * 114)) / 1000 return (brightness < 0.10) } func isLight(threshold: Float = 0.7) -> Bool { let originalCGColor = self.cgColor // Now we need to convert it to the RGB colorspace. UIColor.white / UIColor.black are greyscale and not RGB. // If you don't do this then you will crash when accessing components index 2 below when evaluating greyscale colors. let RGBCGColor = originalCGColor.converted(to: CGColorSpaceCreateDeviceRGB(), intent: .defaultIntent, options: nil) guard let components = RGBCGColor?.components else { return false } guard components.count >= 3 else { return false } let brightness = Float(((components[0] * 299) + (components[1] * 587) + (components[2] * 114)) / 1000) return (brightness > threshold) } func image(_ size: CGSize = CGSize(width: 1, height: 1)) -> UIImage { return UIGraphicsImageRenderer(size: size).image { rendererContext in self.setFill() rendererContext.fill(CGRect(origin: .zero, size: size)) } } }