¿Cómo dibujar CGGradient con un color específico?

Tengo este código Objective-C que encontré en alguna parte. Honestamente, no entiendo nada de lo que está sucediendo allí. No estoy familiarizado con Core Graphics. El siguiente código representa la imagen de la izquierda. Lo que quiero es un gradiente de color similar a la imagen de la derecha (el color deseado tiene RGB de 12, 138, 255). ¿Dónde diablos cambio este código para obtener el resultado deseado?

- (void)drawRect:(CGRect)rect {

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGSize titleSize = [croppedTitle sizeWithFont:kTokenTitleFont];

    CGRect bounds = CGRectMake(0, 0, titleSize.width + 17, titleSize.height + 5);
    CGRect textBounds = bounds;
    textBounds.origin.x = (bounds.size.width - titleSize.width) / 2;
    textBounds.origin.y += 4;

    CGFloat arcValue = (bounds.size.height / 2) + 1;

    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
    CGPoint endPoint = CGPointMake(1, self.bounds.size.height + 10);

    // Draw the outline.
    CGContextSaveGState(context);
    CGContextBeginPath(context);
    CGContextAddArc(context, arcValue, arcValue, arcValue, (M_PI / 2), (3 * M_PI / 2), NO);
    CGContextAddArc(context, bounds.size.width - arcValue, arcValue, arcValue, 3 * M_PI / 2, M_PI / 2, NO);
    CGContextClosePath(context);

    CGFloat red = 1;
    CGFloat green = 1;
    CGFloat blue = 1;
    CGFloat alpha = 1;
    [tintColor ti_getRed:&red green:&green blue:&blue alpha:&alpha];

    if (highlighted){
        // highlighted outline color
        CGContextSetFillColor(context, (CGFloat[8]){red, green, blue, 1});
        CGContextFillPath(context);
        CGContextRestoreGState(context);
    }
    else
    {
        CGContextClip(context);
        CGFloat locations[2] = {0, 0.95};
        // unhighlighted outline color
        CGFloat components[8] = {red + .2, green +.2, blue +.2, alpha, red, green, blue, alpha};
        CGGradientRef gradient = CGGradientCreateWithColorComponents(colorspace, components, locations, 2);
        CGContextDrawLinearGradient(context, gradient, CGPointZero, endPoint, 0);
        CGGradientRelease(gradient);
        CGContextRestoreGState(context);
    }

    // Draw a white background so we can use alpha to lighten the inner gradient
    CGContextSaveGState(context);
    CGContextBeginPath(context);
    CGContextAddArc(context, arcValue, arcValue, (bounds.size.height / 2), (M_PI / 2) , (3 * M_PI / 2), NO);
    CGContextAddArc(context, bounds.size.width - arcValue, arcValue, arcValue - 1, (3 * M_PI / 2), (M_PI / 2), NO);
    CGContextClosePath(context);
    CGContextSetFillColor(context, (CGFloat[8]){1, 1, 1, 1});
    CGContextFillPath(context);
    CGContextRestoreGState(context);

    // Draw the inner gradient.
    CGContextSaveGState(context);
    CGContextBeginPath(context);
    CGContextAddArc(context, arcValue, arcValue, (bounds.size.height / 2), (M_PI / 2) , (3 * M_PI / 2), NO);
    CGContextAddArc(context, bounds.size.width - arcValue, arcValue, arcValue - 1, (3 * M_PI / 2), (M_PI / 2), NO);
    CGContextClosePath(context);


    CGContextClip(context);

    CGFloat locations[2] = {0, highlighted ? 0.8 : 0.4};
    CGFloat highlightedComp[8] = {red, green, blue, .6, red, green, blue, 1};
    CGFloat nonHighlightedComp[8] = {red, green, blue, .2, red, green, blue, .4};


    CGGradientRef gradient = CGGradientCreateWithColorComponents (colorspace, highlighted ? highlightedComp : nonHighlightedComp, locations, 2);
    CGContextDrawLinearGradient(context, gradient, CGPointZero, endPoint, 0);
    CGGradientRelease(gradient);
    CGColorSpaceRelease(colorspace);

    [(highlighted ? [UIColor whiteColor] : [UIColor blackColor]) set];
    [croppedTitle drawInRect:textBounds withFont:kTokenTitleFont];

    CGContextRestoreGState(context);
}

- (BOOL)ti_getRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha {

    CGColorSpaceModel colorSpaceModel = CGColorSpaceGetModel(CGColorGetColorSpace(self.CGColor));
    const CGFloat * components = CGColorGetComponents(self.CGColor);

    if (colorSpaceModel == kCGColorSpaceModelMonochrome){

        if (red) *red = components[0];
        if (green) *green = components[0];
        if (blue) *blue = components[0];
        if (alpha) *alpha = components[1];
        return YES;
    }

    if (colorSpaceModel == kCGColorSpaceModelRGB){

        if (red) *red = components[0];
        if (green) *green = components[1];
        if (blue) *blue = components[2];
        if (alpha) *alpha = components[3];
        return YES;
    }

    return NO;
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta