iOS – Transición / animation de cambio de color suave

Quiero tener una transición de color suave que atraviese todo el espectro (es decir, rojo, azul, verde, amarillo, naranja, etc.)

También desea poder tener transiciones suaves de colors en un espectro específico (es decir, todos los rojos).

¿Hay algún algorithm simple / funciones / fórmulas recursivas que puedan ayudar a simplificar este process?

Una forma muy sencilla de lograr esto sería utilizar un bloque de animation UIView.

[UIView animateWithDuration:1.0 animations:^{ view.backgroundColor = [UIColor networkingColor]; }]; 

Esto se interpolará entre el color de background anterior de cualquier view y el rojo en el transcurso de 1 segundo.

Swift :

 UIView.animate(withDuration: 1.0) { view.backgroundColor = .networking } 

Use el siguiente código para la transición de color en iOS, le ofrece varias opciones configurables:
1) Retraso antes de comenzar la animation
2) Devolución de llamada en la finalización de la animation
3) Opciones para la animation

 [UIView animateWithDuration:1.0 delay:0.2 options:0 animations:^{ view.backgroundColor = [UIColor greenColor]; } completion:^(BOOL finished) { NSLog(@"Color transformation Completed"); }]; 

Para una descripción detallada de diferentes animaciones, visite:
Tutorial UIView para iOS: Cómo usar UIView Animation

Una forma posible de hacerlo es aplicar una animation de color de background en la capa de la vista.

Ahora, para pasar por todo el espectro, tienes que trabajar en combinaciones de tres colors.

La mejor manera de lograr esto es usar 'Hue'.

[[UIColor alloc] initWithHue: 135 / 360.0f de saturación: 1 brillo: 1 alfa: 1]

Ahora tiene que iterar para todos los valores de Hue y obtendrá una transición suave que atraviesa todo el espectro.

Código de muestra:

  1. hacer una variable local

int _currentColorHue = 0;

  1. Llamada recursiva para cambiar el color de background.

– (void) animateMyView {

 [UIView animateWithDuration:0.01 animations:^{ self.view.layer.backgroundColor = [[UIColor alloc] initWithHue:_currentColorHue/360.0f saturation:1 brightness:1 alpha:1].CGColor; } completion:^(BOOL finished) { _currentColorHue++; if (_currentColorHue > 360) { _currentColorHue = 0; } [self animateMyView]; }]; } 

Puedes detener la animation según tu uso.