objective-c ios uicolor inverse

objective c - ¿Cómo obtener color inverso de UIColor?



objective-c ios (8)

---- EDITAR ----

Basándome en la respuesta de @amleszk, actualicé la categoría UIColor con este método:

- (UIColor *)inverseColor { CGFloat alpha; CGFloat white; if ([self getWhite:&white alpha:&alpha]) { return [UIColor colorWithWhite:1.0 - white alpha:alpha]; } CGFloat hue, saturation, brightness; if ([self getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha]) { return [UIColor colorWithHue:1.0 - hue saturation:1.0 - saturation brightness:1.0 - brightness alpha:alpha]; } CGFloat red, green, blue; if ([self getRed:&red green:&green blue:&blue alpha:&alpha]) { return [UIColor colorWithRed:1.0 - red green:1.0 - green blue:1.0 - blue alpha:alpha]; } return nil; }

---- OBSOLETO ----

Basándome en la respuesta de @grc, creo una categoría de UIColor con este método:

- (UIColor *)inverseColor { CGColorRef oldCGColor = self.CGColor; int numberOfComponents = CGColorGetNumberOfComponents(oldCGColor); // can not invert - the only component is the alpha // e.g. self == [UIColor groupTableViewBackgroundColor] if (numberOfComponents == 1) { return [UIColor colorWithCGColor:oldCGColor]; } const CGFloat *oldComponentColors = CGColorGetComponents(oldCGColor); CGFloat newComponentColors[numberOfComponents]; int i = numberOfComponents - 1; newComponentColors[i] = oldComponentColors[i]; // alpha while (--i >= 0) { newComponentColors[i] = 1 - oldComponentColors[i]; } CGColorRef newCGColor = CGColorCreate(CGColorGetColorSpace(oldCGColor), newComponentColors); UIColor *newColor = [UIColor colorWithCGColor:newCGColor]; CGColorRelease(newCGColor); return newColor; }

Por ejemplo, el color inverso del negro debe ser blanco.


Entonces, para ayudar a todos los swifters, vinimos aquí en busca de la respuesta. Así es como debería ser:

func inverseColor(color: UIColor) -> UIColor{ var a: CGFloat = 0.0; var r: CGFloat = 0.0; var g: CGFloat = 0.0; var b: CGFloat = 0.0; color.getRed(&r, green: &g, blue: &b, alpha: &a); return UIColor(red: -r, green: -g, blue: -b, alpha: a); }


Esto debería funcionar:

// oldColor is the UIColor to invert const CGFloat *componentColors = CGColorGetComponents(oldColor.CGColor); UIColor *newColor = [[UIColor alloc] initWithRed:(1.0 - componentColors[0]) green:(1.0 - componentColors[1]) blue:(1.0 - componentColors[2]) alpha:componentColors[3]];

Fuente: ¿ Comprobar si UIColor es oscuro o brillante?


La solución de GRC tiene un problema: CGColorGetComponents regresa en una escala de 0.0-1.0, y no de 2-255. Así que deberías usar

UIColor *newColor = [[UIColor alloc] initWithRed:(1.0 - componentColors[0]) green:(1.0 - componentColors[1]) blue:(1.0 - componentColors[2]) alpha:componentColors[3]];

en lugar. De lo contrario todo será blanco (1.0 y lager).

es lo mismo que usó amleszk, allí también hay 1.-color, en lugar de 255. Por cierto que 1. representa el flotador 1.0, deberías escribir 1.0 en lugar de 1., para evitar confusiones


No obtuvo colores inversos para el gris. Por lo tanto, los efectos cuando se usa fondo gris y su color inverso como color de texto

ESTA Funciona incluso para el color gris, acabo de agregar un código adicional al código de @wills.

//====== TO GET THE OPPOSIT COLORS ===== -(UIColor *)reverseColorOf :(UIColor *)oldColor { CGColorRef oldCGColor = oldColor.CGColor; int numberOfComponents = CGColorGetNumberOfComponents(oldCGColor); // can not invert - the only component is the alpha if (numberOfComponents == 1) { return [UIColor colorWithCGColor:oldCGColor]; } const CGFloat *oldComponentColors = CGColorGetComponents(oldCGColor); CGFloat newComponentColors[numberOfComponents]; int i = numberOfComponents - 1; newComponentColors[i] = oldComponentColors[i]; // alpha while (--i >= 0) { newComponentColors[i] = 1 - oldComponentColors[i]; } CGColorRef newCGColor = CGColorCreate(CGColorGetColorSpace(oldCGColor), newComponentColors); UIColor *newColor = [UIColor colorWithCGColor:newCGColor]; CGColorRelease(newCGColor); //=====For the GRAY colors ''Middle level colors'' CGFloat white = 0; [oldColor getWhite:&white alpha:nil]; if(white>0.3 && white < 0.67) { if(white >= 0.5) newColor = [UIColor darkGrayColor]; else if (white < 0.5) newColor = [UIColor blackColor]; } return newColor; }


Una manera rápida es extender UIColor:

extension UIColor { func inverse () -> UIColor { var r:CGFloat = 0.0; var g:CGFloat = 0.0; var b:CGFloat = 0.0; var a:CGFloat = 0.0; if self.getRed(&r, green: &g, blue: &b, alpha: &a) { return UIColor(red: 1.0-r, green: 1.0 - g, blue: 1.0 - b, alpha: a) } return .black // Return a default colour } }


Utilicé la respuesta de Dade y la modifiqué un poco porque estaba buscando una buena forma de calcular el color de primer plano de un texto dado un color de fondo.

Por lo tanto, si desea obtener un buen color de texto para un color de fondo determinado, le sugiero que lo haga. Te da el color más brillante de tu color de fondo dado:

extension UIColor { func maxBright() -> UIColor { var r:CGFloat = 0.0; var g:CGFloat = 0.0; var b:CGFloat = 0.0; var a:CGFloat = 0.0; if self.getRed(&r, green: &g, blue: &b, alpha: &a) { let d:CGFloat = 1.0 - max(r,g,b) return UIColor(red: r + d, green: g + d , blue: b + d, alpha: 1.0) } return self } }

Funciona como deslizar los controles deslizantes RGB hacia arriba hasta que el componente más brillante alcance el máximo.

Ejemplo:

titleLable.backgroundColor = UIColor.blackColor() titleLabel.textColor = titleLabel.backgroundColor?.maxBright()

le dará una etiqueta en blanco sobre negro. Prueba otros colores y verás resultados interesantes :)

Es posible que esto no sea lo que estaba buscando, pero da resultados interesantes para los colores del texto anterior / posterior.

Solo compartiendo


iOS5 +

-(UIColor*) inverseColor { CGFloat r,g,b,a; [self getRed:&r green:&g blue:&b alpha:&a]; return [UIColor colorWithRed:1.-r green:1.-g blue:1.-b alpha:a]; }