ishahak ishahak - 7 days ago 6
iOS Question

iOS: How to generate random pastel colors?

How can I generate great looking pastel colors for iOS?

There is an excellent colorful answer in Java by David Crow here: Algorithm to randomly generate an aesthetically-pleasing color palette

So how we adapt it to iOS?

Answer

A Swift implementation by John Coates appears here: https://gist.github.com/JohnCoates/725d6d3c5a07c4756dec but he wrongly called it "pastel" although not including the required light-blue to achieve that effect.

My Objective-C version for John's git (with mixing of light blue) is here:

// Adapted from Stack Overflow answer by David Crow http://stackoverflow.com/a/43235
-(UIColor*) generateRandomPastelColor
{
    // Randomly generate numbers
    CGFloat red  = ( (CGFloat)(arc4random() % 256) ) / 256;
    CGFloat green  = ( (CGFloat)(arc4random() % 256) ) / 256;
    CGFloat blue  = ( (CGFloat)(arc4random() % 256) ) / 256;

    // Mix with light-blue
    CGFloat mixRed = 1+0xad/256, mixGreen = 1+0xd8/256, mixBlue = 1+0xe6/256;
    red = (red + mixRed) / 3;
    green = (green + mixGreen) / 3;
    blue = (blue + mixBlue) / 3;
    return [UIColor colorWithRed:red green:green blue:blue alpha:1];
}

EDIT

I have improved the algorithm, making the colors brighter, by mixing also white into the computation (by adding 1 to the light blue and diving by 3 instead of 2).

Here is a test code for the above method (you can replace viewDidLoad of a new project and run):

#define RECT_SIZE 30

- (void)viewDidLoad {
    [super viewDidLoad];
    CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;
    CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height;
    int horizontals = screenWidth / RECT_SIZE;
    int verticals = screenHeight / RECT_SIZE;
    float offset_h = ((int)screenWidth % RECT_SIZE)/2;
    float offset_v = ((int)screenHeight % RECT_SIZE)/2;
    for (int v=0; v < verticals; v++) {
        for (int h=0; h < horizontals; h++) {
            CGRect rect = CGRectMake(offset_h + h * RECT_SIZE, offset_v + v * RECT_SIZE, RECT_SIZE, RECT_SIZE);
            UIView *square = [[UIView alloc] initWithFrame:rect];
            square.backgroundColor = [self generateRandomPastelColor];
            [self.view addSubview:square];
        }
    }
}