2012-10-10 37 views
8

Tengo UIScrollView que contiene varias subvistas (UIImageViews, UILabels y UIViews estándar). Algunas UIImageViews están parcialmente cubiertas por otras UIViews.Fading UIView permite ver las subvistas

Sin embargo, cuando desaparezco UIScrollView, las partes parcialmente cubiertas de UIImageViews se exponen durante el breve momento de la animación.

Quiero ser capaz de atenuar la vista de desplazamiento y todo su contenido al mismo tiempo en la misma animación, es decir, no revelar ninguna de las imágenes parcialmente cubiertas.

Si no es posible, siempre puedo agregar una UIView sobre todos los demás controles y desvanecerla de alfa 0 a 1 para ocultar todo, pero estoy seguro de que hay una forma de realizar un fundido completo en una vista y todas sus subvistas.

yo probamos este:

[UIView beginAnimations:nil context:NULL]; 
[scrollViewResults setAlpha:0.0f]; 
[UIView commitAnimations]; 

y he intentado esto:

- (IBAction)questionGroupChanged:(UIButton*)sender { 
    [UIView beginAnimations:nil context:NULL]; 
    [self fadeViewHierarchy:scrollViewResults toAlpha:0.0f]; 
    [UIView commitAnimations]; 
} 

- (void)fadeViewHierarchy:(UIView*)parentView toAlpha:(float)alpha { 
    [parentView setAlpha:alpha]; 
    for (UIView *subView in parentView.subviews) { 
     [self fadeViewHierarchy:subView toAlpha:alpha]; 
    } 
} 

Pero todavía no conseguido descifrar él. ¿Algunas ideas?

Respuesta

13

Esto sucede debido a la forma en que funciona compositor. Necesita habilitar rasterización en la capa de la vista cuando la decoloración que de entrada/salida:

view.layer.shouldRasterize = YES; 

probablemente debería activar esta única para la duración de la animación, ya que tendrá un poco de tiempo de procesamiento de memoria adicional y gráficos.

+2

Además, no se olvide de establecer la escala adecuada, o sus desvanecimientos rasterizados se verán mal en las pantallas retina. view.layer.rasterizationScale = [UIScreen mainScreen] .scale; – dizy

-2

¿Probaste con métodos de clase UIView + animateWithDuration: * (disponible en iOS 4 y +)

como:

- (void)fadeAllViews 
{ 
    [UIView animateWithDuration:2 
    animations:^{ 
     for (UIView *view in allViewsToFade) 
      view.alpha = 0.0; 
    } 
    completion:^(BOOL finished){} 
    ]; 
} 
+0

Nop. Esto no funcionó. Gracias de todos modos, Emmanuel. – theDuncs

4

La respuesta de Mike es la correcta y merece todo el mérito por esto. Sólo para ilustrar, puede ser que parezca:

- (void)fadeView:(UIView*)view toAlpha:(CGFloat)alpha 
{ 
    view.layer.shouldRasterize = YES; 

    [UIView animateWithDuration:0.75 
        animations:^{ 
         view.alpha = alpha; 
        } 
        completion:^(BOOL finished){ 
         view.layer.shouldRasterize = NO; 
        }]; 
} 

Por lo tanto, la utilización de su scrollViewResults, sería invocada como:

[self fadeView:scrollViewResults toAlpha:0.0f]; 
+0

Gracias por la ilustración @Rob – Stephan

Cuestiones relacionadas