123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- //
- // UIColor+Extension.swift
- // Nextcloud
- //
- // Created by Marino Faggiana on 04/02/2020.
- // Copyright © 2020 Marino Faggiana. All rights reserved.
- //
- // Author Marino Faggiana <marino.faggiana@nextcloud.com>
- //
- // 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 <http://www.gnu.org/licenses/>.
- //
- 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))
- }
- }
- }
|