¿Cómo cambiar el color de CAGradientLayer como salvapantallas?

Me crearon UIView con la aplicación del efecto de color CAGradientLayer cuando CAGradientLayer image. Ahora en esto quiero cambiar su degradado de color de arriba a abajo suavemente como salvapantallas. Me han intentado usar NStimer que bit Hecho, pero su color cambiante en CAGradientLayer parece imbécil.

introduzca la descripción de la imagen aquí

Para más arriba uso el método Bellow del Código:

 Timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(TIMER) userInfo:nil repeats:NO]; -(void)TIMER { Count++; [view_Color1 removeFromSuperview]; view_Color1 = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 341)]; CAGradientLayer *gradient = [CAGradientLayer layer]; gradient.frame = self.view_Color.bounds; if (Count == 1) { gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor greenColor] CGColor], (id)[[UIColor colorWithRed:44/255.0 green:255/255.0 blue:255/255.0 alpha:1.0f] CGColor], (id)[[UIColor colorWithRed:0/255.0 green:0/255.0 blue:254/255.0 alpha:1.0f] CGColor], (id)[[UIColor colorWithRed:252/255.0 green:0/255.0 blue:255/255.0 alpha:1.0f] CGColor], (id)[[UIColor colorWithRed:252/255.0 green:0/255.0 blue:6/255.0 alpha:1.0f] CGColor], (id)[[UIColor colorWithRed:253/255.0 green:131/255.0 blue:6/255.0 alpha:1.0f]CGColor], (id)[[UIColor colorWithRed:255/255.0 green:237/255.0 blue:10/255.0 alpha:1.0f]CGColor], nil]; } else if (Count == 2) { gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor colorWithRed:255/255.0 green:237/255.0 blue:10/255.0 alpha:1.0f]CGColor],(id)[[UIColor greenColor] CGColor], (id)[[UIColor colorWithRed:44/255.0 green:255/255.0 blue:255/255.0 alpha:1.0f] CGColor], (id)[[UIColor colorWithRed:0/255.0 green:0/255.0 blue:254/255.0 alpha:1.0f] CGColor], (id)[[UIColor colorWithRed:252/255.0 green:0/255.0 blue:255/255.0 alpha:1.0f] CGColor], (id)[[UIColor colorWithRed:252/255.0 green:0/255.0 blue:6/255.0 alpha:1.0f] CGColor], (id)[[UIColor colorWithRed:253/255.0 green:131/255.0 blue:6/255.0 alpha:1.0f]CGColor],nil]; } //and so on still count is 7 then again its 1 to continue here are count use for chagen 7 color gradient use and repeat. [self.view addSubview:view_Color1]; [self.view_Color1.layer addSublayer:gradient]; [myappdelegare shanetworkinginstance].str_LastColorClick = [[NSString alloc]initWithFormat:@"MultiColor"]; Timer = [NSTimer scheduledTimerWithTimeInterval:0.30 target:self selector:@selector(TIMER) userInfo:nil repeats:NO]; } 

¿Podrías ayudarme?

Gracias

No me di count primero de que estás "saltando" con colors a cada paso.

Aquí hay un código que hace la animation:

 - (void) initGradient { if ( !gradient ) { gradient = [CAGradientLayer layer]; gradient.frame = self.view.bounds; [self.view.layer addSublayer:gradient]; NSArray *baseColors = [NSArray arrayWithObjects:(id)[UIColor yellowColor].CGColor, (id)[UIColor networkingColor].CGColor, (id)[UIColor blueColor].CGColor, (id)[UIColor greenColor].CGColor, nil]; NSMutableArray *colors = [NSMutableArray arrayWithArray:baseColors]; [colors addObjectsFromArray:baseColors]; gradient.colors = colors; cnt = [baseColors count]; NSMutableArray *locations = [NSMutableArray array]; CGFloat step = 1. / (cnt - 1.); CGFloat loc = 0; for ( NSUInteger i = 0; i < [colors count]; i++ ) { [locations addObject:@(loc)]; loc += step; } gradient.locations = [locations copy]; } } -(void)TIMER { NSMutableArray *locations = [NSMutableArray array]; CGFloat step = 1. / (cnt - 1.); static const CGFloat speed = 3; CGFloat initialStep = speed / gradient.bounds.size.height; CGFloat loc = [gradient.locations[0] floatValue] - initialStep; if ( loc <= -1 - step ) loc = initialStep; for ( NSUInteger i = 0; i < [gradient.locations count]; i++ ) { [locations addObject:@(loc)]; loc += step; } [CATransaction begin]; [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; gradient.locations = [locations copy]; [CATransaction commit]; Count++; if ( Count >= [gradient.colors count] ) Count = 0; [self performSelector:@selector(TIMER) withObject:nil afterDelay:0.04]; } 

Todavía tiene un pequeño problema, que el píxel superior de la vista tiene un color mixto pero que se anima muy bien. También puede ajustar la velocidad (velocidad CGFloat estática). Lo dejo a usted para resolver, tal vez clip.

Si desea animar las properties de la capa, no use NSTimer, use una de las classs de CAAnimation 'familia'. En su caso, si desea animar entre varios gradientes diferentes, CAKeyFrameAnimation es la opción correcta. Código de ejemplo para agregar animation de capa a la capa de gradiente:

 - (void) addColorsAnimationToGradientLayer:(CAGradientLayer*)glayer { NSMutableArray *colors = [glayer.colors mutableCopy]; NSMutableArray *animationColors = [@[] mutableCopy]; for (int i = 0; i < colors.count; ++i) { [animationColors addObject:[colors copy]]; id lastColor = [colors lastObject]; [colors removeObjectAtIndex:colors.count-1]; [colors insertObject:lastColor atIndex:0]; } CAKeyframeAnimation *kfAnimation = [CAKeyframeAnimation animationWithKeyPath:@"colors"]; kfAnimation.values = animationColors; kfAnimation.duration = 5.0f; kfAnimation.repeatCount = HUGE_VALF; kfAnimation.autoreverses = YES; [glayer addAnimation:kfAnimation forKey:@"colors"]; } 

En el código mencionado anteriormente, creo animation de bucle infinito donde los colors de gradiente se obtienen mediante la permutación cíclica de colors en el gradiente inicial:

 KeyFrame0: [color0, color1, color2,…, colorN] KeyFrame1: [colorN, color0, color1, color2,…, colorN-1] … KeyFrame(N-1): [color1, color2, color3,…, color0]