2012-10-10 2 views
8

Ho un UIScrollView che contiene varie sottoview (UIImageViews, UILabels e UIViews standard). Alcune delle UIImageViews sono parzialmente coperte da altre UIViews.Fading UIView consente di visualizzare le sottoview

Tuttavia, quando scompare l'UIScrollView, le parti parzialmente coperte di UIImageViews vengono esposte per il breve momento dell'animazione.

Desidero essere in grado di svanire la vista a scorrimento e tutto il suo contenuto contemporaneamente nella stessa animazione, ovvero non rivelando alcuna delle immagini parzialmente coperte.

Se non è possibile, posso sempre aggiungere un UIView in cima a tutti gli altri controlli e sfumarlo da alfa 0 fino a 1 per nascondere tutto, ma sono sicuro che c'è un modo per eseguire una dissolvenza completa su una vista e tutto è sottoview.

ho provato questo:

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

e ho provato questo:

- (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]; 
    } 
} 

ma non ho ancora incrinato esso. Qualche idea?

risposta

13

Questo accade a causa del modo in cui funziona compositor. È necessario attivare rasterizzazione sul layer della vista quando dissolvenza in/out:

view.layer.shouldRasterize = YES; 

probabilmente si dovrebbe abilitare solo questo per la durata dell'animazione, perché ci vorrà un po 'di memoria extra e grafica tempo di elaborazione.

+2

Inoltre, non dimenticare di impostare la scala corretta, altrimenti le dissolvenze rasterizzate sembreranno schifose sui display della retina. view.layer.rasterizationScale = [UIScreen mainScreen] .scale; – dizy

-2

Avete provato con metodi di classe UIView + animateWithDuration: * (disponibile su iOS 4 e +)

piace:

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

Nope. Questo non ha funzionato. Grazie comunque a Emmanuel. – theDuncs

4

La risposta di Mike è corretta e merita tutto il merito. Proprio per illustrare, potrebbe assomigliare:

- (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; 
        }]; 
} 

Così, usando il vostro scrollViewResults, sarebbe essere invocato come:

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

Grazie per l'illustrazione @Rob – Stephan