Iconos shinys de iPhone con charts principales

Me preguntaba si alguien sabe cómo tomar una Imagen usando CoreGraphics y agregar un efecto de brillo como lo ves en iOS. Específicamente, quiero tomar una image que se descarga de la web y diseñarla de esta manera. He buscado alto y bajo y todo lo que encontré fue ejemplos de cómo hacerlo en PhotoShop y no en el código. Cualquier fragment de código o pointers a los resources que pueden ayudar, lo agradecería.

Lo descubrí por mi count después de desperdiciar algunas horas tratando de resolver esto … Aquí está mi código:

static void addRoundedRectToPath(CGContextRef context, CGRect rect, float ovalWidth, float ovalHeight) { float fw, fh; if (ovalWidth == 0 || ovalHeight == 0) { CGContextAddRect(context, rect); return; } CGContextSaveGState(context); CGContextTranslateCTM (context, CGRectGetMinX(rect), CGRectGetMinY(rect)); CGContextScaleCTM (context, ovalWidth, ovalHeight); fw = CGRectGetWidth (rect) / ovalWidth; fh = CGRectGetHeight (rect) / ovalHeight; CGContextMoveToPoint(context, fw, fh/2); CGContextAddArcToPoint(context, fw, fh, fw/2, fh, 1); CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 1); CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 1); CGContextAddArcToPoint(context, fw, 0, fw, fh/2, 1); CGContextClosePath(context); CGContextRestoreGState(context); } static void addGlossPath(CGContextRef context, CGRect rect) { CGFloat quarterHeight = CGRectGetMidY(rect) / 2; CGContextSaveGState(context); CGContextBeginPath(context); CGContextMoveToPoint(context, -20, 0); CGContextAddLineToPoint(context, -20, quarterHeight); CGContextAddQuadCurveToPoint(context, CGRectGetMidX(rect), quarterHeight * 3, CGRectGetMaxX(rect) + 20, quarterHeight); CGContextAddLineToPoint(context, CGRectGetMaxX(rect) + 20, 0); CGContextClosePath(context); CGContextRestoreGState(context); } UIImage *applyIconHighlightToImage(UIImage *icon) { UIImage *newImage; CGContextRef context; CGGradientRef glossGradient; CGColorSpaceRef rgbColorspace; CGRect currentBounds = CGRectMake(0, 0, icon.size.width, icon.size.height); CGPoint topCenter = CGPointMake(CGRectGetMidX(currentBounds), 0.0f); CGPoint midCenter = CGPointMake(CGRectGetMidX(currentBounds), CGRectGetMidY(currentBounds)); CGFloat locations[2] = {0.0, 1.0}; CGFloat components[8] = {1.0, 1.0, 1.0, 0.75, 1.0, 1.0, 1.0, 0.2}; UIGraphicsBeginImageContext(icon.size); context = UIGraphicsGetCurrentContext(); UIGraphicsPushContext(context); addRoundedRectToPath(context, currentBounds, 10, 10); CGContextClosePath(context); CGContextClip(context); [icon drawInRect:currentBounds]; addGlossPath(context, currentBounds); CGContextClip(context); rgbColorspace = CGColorSpaceCreateDeviceRGB(); glossGradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, 2); CGContextDrawLinearGradient(context, glossGradient, topCenter, midCenter, 0); UIGraphicsPopContext(); newImage = UIGraphicsGetImageFromCurrentImageContext(); CGGradientRelease(glossGradient); CGColorSpaceRelease(rgbColorspace); UIGraphicsEndImageContext(); return newImage; } 

Edit: Quería asegurarme de haber dado crédito en el momento del vencimiento del crédito. Gracias a Brad Larson por el código para agregar un gradiente shiny.

Proporciono código para dibujar un gradiente shiny usando Core Graphics en mi respuesta aquí .

Si todo lo que desea es superponer un efecto de brillo en su image, puede ser más eficaz generar esto usando un CAGradientLayer, como lo describe Mirko en su respuesta allí.