Animación UIScrollview según el desplazamiento de contenido

Estoy usando una UIScrollView horizontal, y quiero una transición de color de background dependiendo del valor x del desplazamiento de contenido.

Ejemplo: el ancho de UIScrollView es 640px. Cuando el desplazamiento de contenido es igual a 0px, el color de background debe ser rojo. Cuando el desplazamiento del contenido es de 320 px, el background debe ser amarillo. Pero la parte más importante es que cuando el UIScrollview está entre 0px y 320px, el color de background debe estar entre rojo y amarillo.

Sugerencia: la aplicación de Twitter para iOS tiene la misma animation cuando desliza hacia la izquierda desde una búsqueda. La label de la navigation desaparece ligeramente.

Necesita crear el color según el porcentaje de compensación.

La forma más fácil de crear un cambio entre colors como este es usar el espacio de color HSB.

Además, esto no es una animation. El efecto de "animation" se le otorga mediante scrollview. Solo necesita configurar el color cada vez que cambie la vista de desplazamiento.

En el método delegado, podría hacer algo como esto.

Edita para hacer más flexible

// this just calculates the percentages now and passes it off to another method. - (void)scrollViewDidScroll:(UIScrollView *)scrollView { // vertical CGFloat maximumVerticalOffset = scrollView.contentSize.height - CGRectGetHeight(scrollView.frame); CGFloat currentVerticalOffset = scrollView.contentOffset.y; // horizontal CGFloat maximumHorizontalOffset = scrollView.contentSize.width - CGRectGetWidth(scrollView.frame); CGFloat currentHorizontalOffset = scrollView.contentOffset.x; // percentages CGFloat percentageHorizontalOffset = currentHorizontalOffset / maximumHorizontalOffset; CGFloat percentageVerticalOffset = currentVerticalOffset / maximumVerticalOffset; [self scrollView:scrollView didScrollToPercentageOffset:CGPointMake(percentageHorizontalOffset, percentageVerticalOffset)]; } // this just gets the percentage offset. // 0,0 = no scroll // 1,1 = maximum scroll - (void)scrollView:(UIScrollView *)scrollView didScrollToPercentageOffset:(CGPoint)percentageOffset { UIColor *HSBColor = [self HSBColorForOffsetPercentage:percentageOffset.x]; UIColor *RGBColor = [self RGBColorForOffsetPercentage:percentageOffset.x]; } // HSB color just using Hue - (UIColor *)HSBColorForOffsetPercentage:(CGFloat)percentage { CGFloat minColorHue = 0.0; CGFloat maxColorHue = 0.2; // this is a guess for the yellow hue. CGFloat actualHue = (maxColorHue - minColorHue) * percentage + minColorHue; // change these values to get the colours you want. // I find networkingucing the saturation to 0.8 ish gives nicer colours. return [UIColor colorWithHue:actualHue saturation:1.0 brightness:1.0 alpha:1.0]; } // RGB color using all R, G, B values - (UIColor *)RGBColorForOffsetPercentage:(CGFloat)percentage { // RGB 1, 0, 0 = networking CGFloat minColorRed = 1.0; CGFloat minColorGreen = 0.0; CGFloat minColorBlue = 0.0; // RGB 1, 1, 0 = yellow CGFloat maxColorRed = 1.0; CGFloat maxColorGreen = 1.0; CGFloat maxColorBlue = 0.0; // if you have specific beginning and end RGB values then set these to min and max respectively. // it should even work if the min value is greater than the max value. CGFloat actualRed = (maxColorRed - minColorRed) * percentage + minColorRed; CGFloat actualGreen = (maxColorGreen - minColorGreen) * percentage + minColorGreen; CGFloat actualBlue = (maxColorBlue - minColorBlue) * percentage + minColorBlue; return [UIColor colorWithRed:actualRed green:actualGreen blue:actualBlue alpha:1.0]; } 

No sé cómo se comportará el método RGB en valores medios. Puede ponerse marrón en el centro, etc … pero puedes jugar.

Esto debería darle una idea de cómo animar CUALQUIER COSA usando la vista de desplazamiento como una forma de controlarlo.

Con este método puede controlar la opacidad, el tamaño, la rotation, el tamaño de fuente, etc. Incluso puede combinar varias cosas (como lo hice con RGB).

En su delegado scrollView intente algo como esto:

 -(void)scrollViewDidScroll:(UIScrollView *)scrollView{ CGPoint a = self.mainScrollView.contentOffset; if(ax >= 320){ [UIView animateWithDuration:0.5 animations:^{ [self.view setBackgroundColor:[UIColor networkingColor]]; }]; } else{ [UIView animateWithDuration:0.5 animations:^{ [self.view setBackgroundColor:[UIColor yellowColor]]; }]; } }