2012-01-21 8 views
13

Używam następujący kod w moim prezentującej VC zanikać w dziecku modalne VC, i to działa prawidłowo:Jak odrzucić modalne VC z zanikiem animacji?

self.infoViewController.view.alpha = 0.0; 
[self.navigationController presentModalViewController:self.infoViewController animated:NO]; 
[UIView animateWithDuration:0.5 
      animations:^{self.infoViewController.view.alpha = 1.0;}]; 

Jednak nie mogę zmusić go do zanikania, próbowałem kilka rzeczy, jest to najnowsza próbowałem że nie działa:

- (IBAction)dismissAction:(id)sender 
{ 
if ([[self parentViewController] respondsToSelector:@selector(dismissModalViewControllerAnimated:)]) 
{ 
    [[self parentViewController] dismissModalViewControllerAnimated:YES]; 
    self.parentViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
    self.parentViewController.view.alpha = 0.0; 
    [UIView animateWithDuration:0.5 
        animations:^{self.parentViewController.view.alpha = 1.0;}]; 
} else 
{ 
    [[self presentingViewController] dismissViewControllerAnimated:YES completion:nil]; 
    self.presentedViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
    self.presentedViewController.view.alpha = 0.0; 
    [UIView animateWithDuration:0.5 
        animations:^{ 
         self.presentedViewController.view.alpha = 1.0;}]; 
} 

}

modalny kontroler widoku jest wyciszony, ale od razu, a nie w okresie czasu jak to jest, kiedy jego wyświetlany.

+0

Jeśli chcesz, aby ten kod był uruchamiany na urządzeniach wcześniejszych niż iOS 5, musisz zabezpieczyć wywołanie 'prezentViewController', a także' dismissModalViewControllerAnimated'. – smparkes

+0

Jeśli widzisz animację zakończenia, to z pewnością brzmi jak ten kod jest wykonywany i jest odrzucany przez inną ścieżkę – smparkes

Odpowiedz

48

Ta (oryginalna część) nie ma wpływu na poprawną odpowiedź H2CO3. UIModalTransitionStyleCrossDissolve ma prawie dokładnie taki efekt, jakiego szukasz. Po prostu nie ustawiasz modalTransitionStyle, dopóki nie jest za późno. Wymień wszystkie kodzie z tych funkcji w tam odpowiednich stanowisk:

-(void)show{ 
    self.infoViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
    [self presentModalViewController:self.infoViewController animated:YES]; 
} 
- (IBAction)dismissAction:(id)sender{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 

Edycja w odpowiedzi na taktowaniem, które jest problemem: Porozmawiajmy o kodu naruszającego. Skoncentrujemy się tylko na prawdziwej części, ponieważ jest ona zasadniczo identyczna z inną.

[[self parentViewController] dismissModalViewControllerAnimated:YES]; 
self.parentViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
self.parentViewController.view.alpha = 0.0; 
[UIView animateWithDuration:0.5 
       animations:^{self.parentViewController.view.alpha = 1.0;}]; 

Jeśli szukasz odwrotnej animacji, to nie jest to. W oryginalnej animacji ustawiamy alfa następnego widoku na 0, następnie przedstawiamy następny kontroler widoku, a następnie ustawiamy alfa widoku na 1. Logicznie należy odrzucić kontroler widoku po animacji; Jest to bardzo proste przy użyciu bloków. Kod będzie wyglądał mniej więcej tak:

[UIView animateWithDuration:0.5 animations:^{ 
    self.view.alpha = 0; 
} completion:^(BOOL b){ 
    [self.presentingViewController dismissModalViewControllerAnimated:NO]; 
    self.view.alpha = 1; 
}]; 

Ta linia kodu animuje alfa widoku do 0, a następnie (po zakończeniu) Oddala przedstawione kontroler widoku i ustawia alfa widoku z powrotem do 1. Jest to odwrotność animacja.

+0

Dzięki, ale zarówno ty jak i H2CO3 ignorujesz fakt, że w moim kodzie jest część withDuration. Z zredukowanym kodem nie można ustawić czasu, przez jaki powinno upłynąć zanikanie/zanikanie. A moje ogłoszenie mówi ".. ale nie przez pewien okres czasu". Przepraszam, że mój tytuł być może powinien był powiedzieć, jak osiągnąć zanikanie i kontrolować jego czas trwania, ale myślałem, że było to oczywiste z kodu wysłanego i opisu, przepraszam, jeśli tak nie było. – Gruntcakes

+0

Edytowane w odpowiedzi na komentarz – NJones

+4

Wygląda na to, że w iOS8 należy dodać self.modalTransitionStyle = UIModalTransitionStyleCrossDissolve również na prezentacjiViewController, więc odrzuć to także CrossDissolve –

9

W docs UIViewController, możemy znaleźć:

@property(nonatomic, assign) UIModalTransitionStyle modalTransitionStyle 

ustawić tę właściwość UIModalTransitionStyleCrossDissolve i będzie rozpuszczać poprawnie :)

nadzieję, że pomoże.

+0

Dziękuję, rozpuszcza się, ale robi to natychmiast, podczas gdy mam drugą animację o długości 5.5 Jak mogę ją rozpuścić powoli? – Gruntcakes

+0

[ self.parentViewController dismissModalViewControllerAnimated: TAK]; –

+0

Ustawienie Animowane: na TAK powoduje, że przewijanie jest wyłączone, ustawienie Animowane: na NIE powoduje, że jest ono rozpraszane, ale wciąż od razu: opublikowałem mój najnowszy kod w powyższej edycji. – Gruntcakes

0

Myślę, że to może być przydatne dla tych heroicznych mężczyznami, którzy nadal próbuje użyć MPMoviePlayerViewController w trybie pełnoekranowym i orientacji, która różni się od aplikacji głównej jeden.

Spędziłem dosłownie pół dnia pracy grając prezentując MPMoviePlayerViewController modalnie lub nie modalnie. Ale nie ma w tym szczęścia, w sensie zmiany animacji. (Tryb modalny potrzebny do ustawienia orientacji, która różni się od głównej orientacji aplikacji).

Próbowałem presentViewController lub presentModalViewController, ale wynik jest taki sam. Bez względu na typ zestawu właściwości modalTransitionStyle, jeśli wykonuję [... dismissViewControllerAnimated: true ...], wówczas domyślny styl przejścia (UIModalTransitionStyleCoverVertical) jest i tak używany. Testowałem to na urządzeniach z iOS 5.1 oraz w Symulatorach iOS 6.

Nie próbowałem żadnych innych typów kontrolerów ...Biorąc pod uwagę, że zwykły kontroler ma metodę dismissMoviePlayerViewControllerAnimated, mogę założyć, że ta metoda jest używana w każdym razie do zwolnienia kontrolera wideo, bez względu na to, jak się pojawiła. (Przejścia Wprowadzanie nie działa na mnie, jak również, z wyjątkiem, że nie przetwarza jako CoverVertical (w przypadku modalTransitionStyle zmianie).

Więc moje rozwiązanie było nie używać animacji przejścia na wszystkich. jestem pewien , Apple miał pewne powody, by zezwalać tylko na pewną określoną animację dla MovieViewController (mam taką nadzieję, i to nie było z powodu "lenistwa"), ale jeśli chcieli, aby jakiś miły użytkownik dostał, nie udało im się, jak w mojej aplikacji, która jest jeszcze lepiej, gdy wideo pojawia się bez animacji (co jest gorsze niż CrossDisolving na pewno), ale to jest lepsze niż banalne CoverVertical.

Patrząc na to od autora p W rzeczywistości, wygląda na to, że wydają więcej pieniędzy projektantom, aby malować ładne ikony dla klientów zamiast przyjemniejszej i efektywniejszej pracy programistów. (