2011-04-14 9 views
8

Quiero desvanecer una vista mientras se desplaza dentro de un UIScrollview principal. Cuando comienza la animación de fundido de salida, la vista de desplazamiento deja de desplazarse. Salta a la posición correcta cuando se completa el fundido.Animación dentro de un UIScrollView

Mi fundido de salida se logra con animateWithDuration y bloques de objetos, que se activan en un cambio de página que detecto en scrollViewWillBeginDragging.

¿Alguien sabe cómo hacer que ambos sucedan simultáneamente? Para que quede claro, no estoy 'animando' el desplazamiento UIScrollView, sino que está sucediendo a través de la interacción del usuario de deslizar.

EDIT:

Aquí está el código que estoy usando para atenuar la UIView. Este código está en una clase derivada de UIViewController, que es el delegado para un UIScrollView. Cuando el usuario comienza a arrastrar su dedo, quiero desvanecer el subView. Pero cuando el usuario comienza a arrastrar un dedo, la subvista se desvanece y el desplazamiento se detiene. Después de que el subView se haya desvanecido por completo, la vista de desplazamiento se ajustará a la ubicación donde está el dedo del usuario.

-(void)scrollViewWillBeginDragging:(UIScrollView*)scrollView 
{ 
    [UIView animateWithDuration:0.5 
     animations:^ 
     { 
      self.subView.alpha = 0.0f; 
     } 
     completion:^(BOOL finished) { }]; 
} 

Respuesta

10

muy interesante ... He comprobado esto, y sí, tengo el mismo efecto ... Pues bien, parece que el animateWithDuration de alguna manera bloquea el hilo principal ... que no es lógico, y la documentación tampoco dice nada al respecto ... Sin embargo, hay una solución fácil, algo similar a esto: (he configurado la duración de la animación en 3 para que pueda ver que está funcionando mientras estoy moviendo mi scroll Ver :) ...)

[UIView beginAnimations:@"FadeAnimations" context:nil]; 
[UIView setAnimationDuration:3]; 

self.subview.alpha = 0.0f; 

[UIView commitAnimations]; 
+0

¿Estás diciendo que los métodos UIView normales no afectan a la mesa, mientras que los métodos bloque DO ? Bastante extraño. –

+0

bien ... no sé por qué (todavía), pero he probado esto, y puedo confirmar que funciona así ... – Moszi

+0

Muy interesante. :) –

12

Un poco tarde, pero si quiere seguir usando bloques, se puede utilizar:

animateWithDuration: retardo: Opciones: Animación: completa:

add "UIViewAnimationOptionAllowUserInteraction" a las opciones para permitir la interacción mientras se desplaza.

Estoy seguro de que todavía tendrá el problema de latencia. Esta es la mejor manera en que puedo explicarlo. Por favor, perdónenme por adelantado ya que probablemente estoy usando los términos incorrectos. Todas las animaciones deben ejecutarse en el hilo principal. Cuando llamas a una animación, iOS primero * P * procesa * R * enders antes de generar * F * rames. Se parece a esto.

PPPPRRRRFFFFFFFFFFFFFFFFFF

Pero desde ScrollViews no sabe cuánto tiempo la animación va a ser o cuándo va a terminar, se tiene que realizar la animación de esta manera.

PRFPRFPRFPRFPRFPRFPRFPRF

Mi teoría es que el retraso que está experimentando tiene que ver con estos dos llamadas que chocan en el hilo principal al mismo tiempo. No estoy seguro de cómo resolverías este problema más que con un chip más rápido. Tengo que puedes enviar una animación a la CPU y otra a la GPU, pero todavía no estoy tan avanzado en programación.

+0

Esta solución no funcionó para mí:/ – Lirik

0

De acuerdo con la información que aún no se supone que será ampliamente difundida, todas las versiones de iOS 4.x bloquean por completo la interacción del usuario mientras la animación está en progreso.

¿No es interesante, sin embargo, que usted está siendo evidentemente registrado todavía durante la animación? Hmm ... ¡tal vez eso indica que algo nuevo vendrá en una versión aún por publicar!

Es decir, si puede, lea la documentación de iOS 5 Beta sobre los métodos de clase UIView.

8

Sugeriría, ya que la opacidad se basa en los movimientos del dedo del usuario en UIScrollView, utilizando el método de delegado scrollViewDidScroll :. El scrollView pasado como un parámetro se puede usar para verificar el contentOffset que es simplemente un CGPoint que indica qué tan lejos en la vista de contenido del UIScrollView se ha desplazado el usuario. Algo como esto puede ser utilizado para relacionar la posición de desplazamiento de la opacidad de una vista determinada en un UIScrollView paginado:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    // The case where I used this, the x-coordinate was relevant. You may be concerned with the y-coordinate--I'm not sure 
    CGFloat percent = ((int)(scrollView.contentOffset.x) % (int)(scrollView.frame.size.width))/scrollView.frame.size.width; 
    if (percent > 0.0 && percent < 1.0) { // Of course, you can specify your own range of alpha values 
    relevantView.alpha = percent; // You could also create a mathematical function that maps contentOffset to opacity in a different way than this 
    } 
} 
+0

¡Jacob, eres el rey! – Luda

+0

solución logicak perfecta, he convertido para puntuación vertical gracias compañero – Alok

Cuestiones relacionadas