Created
July 6, 2015 10:31
-
-
Save jernejstrasner/6319645344d17e7df8aa to your computer and use it in GitHub Desktop.
iOS smooth gradient using CGShading
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
- (void)drawRect:(CGRect)rect { | |
// Draw the gradient background | |
CGContextRef context = UIGraphicsGetCurrentContext(); | |
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); | |
// Define the shading callbacks | |
CGFunctionCallbacks callbacks = {0, blackShade, NULL}; | |
// As input to our function we want 1 value in the range [0.0, 1.0]. | |
// This is our position within the 'gradient'. | |
size_t domainDimension = 1; | |
CGFloat domain[2] = {0.0f, 1.0f}; | |
// The output of our function is 2 values, each in the range [0.0, 1.0]. | |
// This is our selected color for the input position. | |
// The 2 values are the white and alpha components. | |
size_t rangeDimension = 2; | |
CGFloat range[8] = {0.0f, 1.0f, 0.0f, 1.0f}; | |
// Create the shading finction | |
CGFunctionRef function = CGFunctionCreate(NULL, domainDimension, domain, rangeDimension, range, &callbacks); | |
// Create the shading object | |
CGShadingRef shading = CGShadingCreateAxial(colorSpace, CGPointMake(1, rect.size.height), CGPointMake(1, rect.size.height*0.75f), function, YES, YES); | |
// Draw the shading | |
CGContextDrawShading(context, shading); | |
// Clean up | |
CGFunctionRelease(function); | |
CGShadingRelease(shading); | |
CGColorSpaceRelease(colorSpace); | |
} | |
// This is the callback of our shading function. | |
static void blackShade(void *info, const CGFloat *inData, CGFloat *outData) { | |
float p = inData[0]; | |
outData[0] = 0.0f; | |
outData[1] = (1.0f-slope(p, 2.0f)) * 0.5f; | |
} | |
// ristributes values on a slope (ease-in ease-out) | |
static float slope(float x, float A) { | |
float p = powf(x, A); | |
return p/(p + powf(1.0f-x, A)); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hello Jernej,
I tried to reach you out on Twitter but I guess that talking here is more appropriate. I've been looking for a smooth gradient solution for days and then I found your article just about a few hours ago but, being a junior developer, and your code is pretty complicated for me to understand! I needed to create a smooth gradient that goes from a transparent color to whatever color I need. I tried editing your code (tried using CGColorSpaceCreateDeviceRGB()) without success. Could you help me out? I would appreciate that so much.
Luca