Get Slightly Lighter and Darker Color from UIColor Get Slightly Lighter and Darker Color from UIColor ios ios

Get Slightly Lighter and Darker Color from UIColor


- (UIColor *)lighterColorForColor:(UIColor *)c{    CGFloat r, g, b, a;    if ([c getRed:&r green:&g blue:&b alpha:&a])        return [UIColor colorWithRed:MIN(r + 0.2, 1.0)                               green:MIN(g + 0.2, 1.0)                                blue:MIN(b + 0.2, 1.0)                               alpha:a];    return nil;}- (UIColor *)darkerColorForColor:(UIColor *)c{    CGFloat r, g, b, a;    if ([c getRed:&r green:&g blue:&b alpha:&a])        return [UIColor colorWithRed:MAX(r - 0.2, 0.0)                               green:MAX(g - 0.2, 0.0)                                blue:MAX(b - 0.2, 0.0)                               alpha:a];    return nil;}

Use it like this:

UIColor *baseColor = // however you obtain your colorUIColor *lighterColor = [self lighterColorForColor:baseColor];UIColor *darkerColor = [self darkerColorForColor:baseColor];

EDIT: as @Anchu Chimala pointed out, for maximum flexibility, these methods should be implemented as an UIColor category. Also, from @Riley's idea, it may be a better idea to make the color proprtionally darker or lighter instead of adding or subtracting constant values. As @jrturton pointed out, it's not necessary to manipulate the RGB components; it's better to modify the brightness property itself. All in all:

@implementation UIColor (LightAndDark)- (UIColor *)lighterColor{    CGFloat h, s, b, a;    if ([self getHue:&h saturation:&s brightness:&b alpha:&a])        return [UIColor colorWithHue:h                          saturation:s                          brightness:MIN(b * 1.3, 1.0)                               alpha:a];    return nil;}- (UIColor *)darkerColor{    CGFloat h, s, b, a;    if ([self getHue:&h saturation:&s brightness:&b alpha:&a])        return [UIColor colorWithHue:h                          saturation:s                          brightness:b * 0.75                               alpha:a];    return nil;}@end


TL;DR:

Swift:

extension UIColor {    var lighterColor: UIColor {        return lighterColor(removeSaturation: 0.5, resultAlpha: -1)    }    func lighterColor(removeSaturation val: CGFloat, resultAlpha alpha: CGFloat) -> UIColor {        var h: CGFloat = 0, s: CGFloat = 0        var b: CGFloat = 0, a: CGFloat = 0        guard getHue(&h, saturation: &s, brightness: &b, alpha: &a)            else {return self}        return UIColor(hue: h,                       saturation: max(s - val, 0.0),                       brightness: b,                       alpha: alpha == -1 ? a : alpha)    }}

Usage:

let lightColor = somethingDark.lighterColor

Objective-C:

- (UIColor *)lighterColorRemoveSaturation:(CGFloat)removeS                              resultAlpha:(CGFloat)alpha {    CGFloat h,s,b,a;    if ([self getHue:&h saturation:&s brightness:&b alpha:&a]) {        return [UIColor colorWithHue:h                          saturation:MAX(s - removeS, 0.0)                          brightness:b                               alpha:alpha == -1? a:alpha];    }    return nil;}- (UIColor *)lighterColor {    return [self lighterColorRemoveSaturation:0.5                                  resultAlpha:-1];}

@rchampourlier was right in his comment to @user529758 (The accepted answer) - The HSB (Or HSV) and RGB solutions give completely different results. RGB just adds (Or makes the color closer to) white, and the HSB solution brings the color closer to the edge in the Brigtness scale - which basically start with black and ends with the pure color...

Basically Brightness (Value) makes the color less or more closer to black, where Saturation makes it less or more closer to white...

As seen here:

HSV color graph

So the solution to make a color actually brighter (i.e. closer to white...) will be to make it's Saturation value smaller, resulting this solution:

- (UIColor *)lighterColor {    CGFloat h,s,b,a;    if ([self getHue:&h saturation:&s brightness:&b alpha:&a]) {        return [UIColor colorWithHue:h                          saturation:MAX(s - 0.3, 0.0)                          brightness:b /*MIN(b * 1.3, 1.0)*/                               alpha:a];    }    return nil;}


Swift universal extension for iOS and OS X, using getHue :

#if os(OSX)    import Cocoa    public  typealias PXColor = NSColor    #else    import UIKit    public  typealias PXColor = UIColor#endif    extension PXColor {    func lighter(amount : CGFloat = 0.25) -> PXColor {        return hueColorWithBrightnessAmount(1 + amount)    }    func darker(amount : CGFloat = 0.25) -> PXColor {        return hueColorWithBrightnessAmount(1 - amount)    }    private func hueColorWithBrightnessAmount(amount: CGFloat) -> PXColor {        var hue         : CGFloat = 0        var saturation  : CGFloat = 0        var brightness  : CGFloat = 0        var alpha       : CGFloat = 0        #if os(iOS)            if getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha) {                return PXColor( hue: hue,                                saturation: saturation,                                brightness: brightness * amount,                                alpha: alpha )            } else {                return self            }            #else            getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha)            return PXColor( hue: hue,                            saturation: saturation,                            brightness: brightness * amount,                            alpha: alpha )        #endif    }}

Usage :

let color = UIColor(red: 0.5, green: 0.8, blue: 0.8, alpha: 1.0)color.lighter(amount:0.5)color.darker(amount:0.5)

OR (with the default values):

color.lighter()color.darker()

Sample :

enter image description here