color bar ios swift colors core-graphics uicolor

ios - bar - uinavigationitem title color



Obtenga variaciones de color más claras y más oscuras para un UIColor dado (4)

¿Cómo obtener diferentes variaciones más claras y más oscuras de un UIColor dado en Swift?


Actualizado

Use debajo de la extensión UIColor:

extension UIColor { func lighter(by percentage: CGFloat = 30.0) -> UIColor? { return self.adjust(by: abs(percentage) ) } 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 } } }

Uso:

let color = UIColor(red:0.96, green:0.54, blue:0.10, alpha:1.0) color.lighter(30) // returns lighter color by 30% color.darker(30) // returns darker color by 30%

en lugar de .lighter() y .darker() , puede usar .adjust() con valores positivos para aclarar y valores negativos para oscurecer

color.adjust(-30) // 30% darker color color.adjust(30) // 30% lighter color

Salida:


La respuesta de Kenji-Tran funciona bien, siempre y cuando su color de inicio no sea negro (valor de brillo 0). Con la adición de unas pocas líneas de código adicional, también puede hacer que el negro sea "más claro" (es decir, aclararlo a una escala de grises o valor de color).

Nota: no pude agregar este cambio mediante una Edición y no puedo comentar la respuesta de Kenji-Tran debido a mi representante de "chico nuevo", por lo tanto, no encontré otra forma de compartir mi conocimiento sobre SO luego publicando una nueva respuesta. Espero que esté bien.

extension UIColor { /** Create a ligher color */ func lighter(by percentage: CGFloat = 30.0) -> UIColor { return self.adjustBrightness(by: abs(percentage)) } /** Create a darker color */ func darker(by percentage: CGFloat = 30.0) -> UIColor { return self.adjustBrightness(by: -abs(percentage)) } /** Try to increase brightness or decrease saturation */ func adjustBrightness(by percentage: CGFloat = 30.0) -> UIColor { var h: CGFloat = 0, s: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0 if self.getHue(&h, saturation: &s, brightness: &b, alpha: &a) { if b < 1.0 { /** Below is the new part, which makes the code work with black as well as colors */ let newB: CGFloat if b == 0.0 { newB = max(min(b + percentage/100, 1.0), 0.0) } else { newB = max(min(b + (percentage/100.0)*b, 1.0), 0,0) } return UIColor(hue: h, saturation: s, brightness: newB, alpha: a) } else { let newS: CGFloat = min(max(s - (percentage/100.0)*s, 0.0), 1.0) return UIColor(hue: h, saturation: newS, brightness: b, alpha: a) } } return self } }


Quiero proporcionar otra versión utilizando brillo y saturación en lugar de RGB

extension UIColor { /** Create a ligher color */ func lighter(by percentage: CGFloat = 30.0) -> UIColor { return self.adjustBrightness(by: abs(percentage)) } /** Create a darker color */ func darker(by percentage: CGFloat = 30.0) -> UIColor { return self.adjustBrightness(by: -abs(percentage)) } /** Try to increase brightness or decrease saturation */ func adjustBrightness(by percentage: CGFloat = 30.0) -> UIColor { var h: CGFloat = 0, s: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0 if self.getHue(&h, saturation: &s, brightness: &b, alpha: &a) { if b < 1.0 { let newB: CGFloat = max(min(b + (percentage/100.0)*b, 1.0), 0.0) return UIColor(hue: h, saturation: s, brightness: newB, alpha: a) } else { let newS: CGFloat = min(max(s - (percentage/100.0)*s, 0.0), 1.0) return UIColor(hue: h, saturation: newS, brightness: b, alpha: a) } } return self } }


Versión con modificación de valores RGB.

Aquí pongo la extensión UIColor simple que se basa en respuestas anteriores. Está funcionando perfectamente para mí.

A continuación la demostración:

Código de manipulación de colores.

public extension UIColor { /** Create a lighter color */ public func lighter(by percentage: CGFloat = 30.0) -> UIColor { return self.adjustBrightness(by: abs(percentage)) } /** Create a darker color */ public func darker(by percentage: CGFloat = 30.0) -> UIColor { return self.adjustBrightness(by: -abs(percentage)) } /** Changing R, G, B values */ func adjustBrightness(by percentage: CGFloat = 30.0) -> UIColor { var red: CGFloat = 0.0 var green: CGFloat = 0.0 var blue: CGFloat = 0.0 var alpha: CGFloat = 0.0 if self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) { let pFactor = (100.0 + percentage) / 100.0 let newRed = (red*pFactor).clamped(to: 0.0 ... 1.0) let newGreen = (green*pFactor).clamped(to: 0.0 ... 1.0) let newBlue = (blue*pFactor).clamped(to: 0.0 ... 1.0) return UIColor(red: newRed, green: newGreen, blue: newBlue, alpha: alpha) } return self } }

Función de sujeción Extensión para mantener fácilmente los valores entre mín y máx.

extension Comparable { func clamped(to range: ClosedRange<Self>) -> Self { if self > range.upperBound { return range.upperBound } else if self < range.lowerBound { return range.lowerBound } else { return self } } }