Agregar CAGradientLayer a UIImageView en UICollectionViewCell tiene un comportamiento extraño

Debo agregar un CAGradientLayer a la image de background de algunas UICollectionViewCells personalizadas. Estoy usando un layout de flujo personalizado que muestra celdas como esta.

RACollectionViewTripleLayout

Diseño triple

Tengo problemas con la reutilización cuando hago scroll en la collectionView y las capas de degradado añadidas a las imágenes cambian de tamaño. Como puede ver en esta image, el gradiente cambia su tamaño.

El tamaño del gradiente cambiado

También tengo problemas con algunas celdas, esas celdas agregan la capa de gradiente dos veces. Entonces, el efecto de sombra que quiero agregar es demasiado oscuro.

Estoy usando este codigo

 - (void)prepareForReuse { [super prepareForReuse]; [self.gradientLayer removeFromSuperlayer]; self.gradientLayer = nil; self.articleImageView.image = nil; } - (void)layoutSubviews { [super layoutSubviews]; [self setupGradient]; } #pragma mark - Setup - (void)setupGradient { UIColor *threeQuartersBlack = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.6]; UIColor *halfBlack = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5]; UIColor *oneQuarterBlack = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.3]; CAGradientLayer *gradient = [CAGradientLayer layer]; CGFloat gradientHeight =self.bounds.size.height/3.0; CGRect gradientBounds = CGRectMake(0, self.bounds.size.height-gradientHeight, self.bounds.size.width, gradientHeight); gradient.frame = gradientBounds; gradient.anchorPoint = CGPointMake(0.5, 0.5); gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor clearColor] CGColor],(id)oneQuarterBlack.CGColor ,(id)halfBlack.CGColor , (id)threeQueartesBlack.CGColor, (id)[[UIColor blackColor] CGColor], nil]; self.gradientLayer = gradient; [self.articleImageView.layer insertSublayer:self.gradientLayer atIndex:0]; } 

Me di count de que si abro ese ViewController y lo muestro de nuevo, todo es correcto.

Alguien tiene alguna idea de lo que debo hacer para resolver esto?

Gracias

Una solución potencial: elimine el gradiente de su UICollectionViewCell y, en su lugar, agréguelo al UIImage que está mostrando, creando un nuevo UIImage que incluya el gradiente. A continuación figura el código para agregar un degradado a un UIImage.

 UIImage *thumbnail = yourImage; UIGraphicsBeginImageContextWithOptions(thumbnail.size, NO, 0.0); [thumbnail drawInRect:CGRectMake(0.f, 0.f, thumbnail.size.width, thumbnail.size.height)]; // Add Gradient to lower half of thumbnail CGContextRef context = UIGraphicsGetCurrentContext(); CGFloat colors[4] = {0.f, 0.f, 0.f, 0.55}; CGFloat locations[2] = {0.f, 1.f}; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colors, locations, 2); CGColorSpaceRelease(colorSpace); CGPoint startPoint = CGPointMake(thumbnail.size.width/2.f, thumbnail.size.height - 40.f); CGPoint endPoint = CGPointMake(thumbnail.size.width/2.f, thumbnail.size.height); CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0); UIImage *newThumbnail = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); 

* Nota: este código aplica la miniatura a los 40 puntos inferiores de la foto. Es posible que desee aplicar al 25% inferior de la foto. Si usa la foto en celdas de vista de colección de diferentes tamaños, el degradado, por supuesto, se escalará con la foto. Si necesita diferentes proporciones de altura de gradiente: altura de la foto, tendrá que crear varias imágenes. La mejor solución es probablemente crear todos los tamaños diferentes de fotos necesarias a la vista si se cargó en un subprocess de background y conectarse a las celdas de vista de colección según sea necesario, lo que garantizará que el image processing no se produzca cada vez que se reutilice una celda de vista de colección.