2012-10-10 10 views
8

Mam UIScrollView, który zawiera różne subviews (UIImageViews, UILabels i standardowe UIViews). Niektóre z UIImageViews są częściowo pokryte przez inne UIViews.Znikanie UIView pozwala zobaczyć subviews

Jednak, kiedy znikają UIScrollView, częściowo zakryte części UIImageViews są narażone na krótki moment animacji.

Chcę mieć możliwość zanikać przewijania i całej jego zawartości w tym samym czasie w tej samej animacji - tj. Nie ujawniając żadnego z częściowo zasłoniętych obrazów.

Jeśli nie jest to możliwe, zawsze mogę dodać UIView na wierzchu wszystkich innych kontrolek i zniknąć z alfa 0 do 1, aby ukryć wszystko, ale jestem pewien, że istnieje sposób na całkowite zanikanie widoku i wszystkie jego subviews.

Próbowałem to:

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

I Próbowałem to:

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

Ale nie zostały jeszcze pęknięty go. Jakieś pomysły?

Odpowiedz

13

Dzieje się tak ze względu na sposób pracach Compositor. Musisz włączyć rasteryzację na warstwie widoku, kiedy blaknięcie go w/out:

view.layer.shouldRasterize = YES; 

Powinieneś chyba tylko umożliwi to na czas trwania animacji bo to zajmie trochę dodatkowej pamięci graficznej i czas przetwarzania.

+2

Nie zapomnij również ustawić właściwej skali, a zrasteryzowane zacienienia będą wyglądać głupio na wyświetlaczach siatkówki. view.layer.rasterizationScale = [UIScreen mainScreen] .scale; – dizy

-2

Próbowałeś z metod klasy UIView + animateWithDuration: * (dostępny na iOS 4 i +)

odczuwalna:

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

Nie. To nie zadziałało. Mimo to dzięki Emmanuel. – theDuncs

4

Odpowiedź Mike'a jest prawidłowa i zasługuje na uznanie. Żeby zilustrować, może to wyglądać tak:

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

Zatem używając scrollViewResults, to być powoływane jako:

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

Dzięki za ilustrację @Rob – Stephan

Powiązane problemy