2012-01-21 18 views
13

estoy usando el siguiente código en mi VC presentar a desvanecerse en el niño modal VC, y esto funciona bien:¿Cómo descartar un VC modal con animación de fundido de salida?

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

Sin embargo no puedo conseguir que se desvanecen, he intentado un par de cosas, esta es la última probé eso no funciona:

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

}

el controlador de vista modal se desvaneció de inmediato, pero no durante un período de tiempo como lo es cuando su pantalla.

+0

Si desea que este código se ejecute en dispositivos anteriores a iOS 5, deberá proteger la llamada a 'presentedViewController' así como a' dismissModalViewControllerAnimated'. – smparkes

+0

Si ve una animación de descarte, seguro Parece que este código se está ejecutando y se está descartando a través de otra ruta. – smparkes

Respuesta

48

Esta (pieza original) no es para quitarte la respuesta correcta de H2CO3. UIModalTransitionStyleCrossDissolve tiene exactamente el efecto que estás buscando. Simplemente no está configurando el modalTransitionStyle hasta que sea demasiado tarde. Reemplazar todo el código con estas funciones en allí respectivas posiciones:

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

Editar en respuesta a tiempo de ser un problema: Hablemos sobre el código erróneo. Nos concentraremos solo en la parte verdadera, ya que es esencialmente idéntica a la otra.

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

Si está buscando una animación recíproca, este no es el caso. En tu animación original, configuraste el alfa de la siguiente vista en 0, luego mostraste el siguiente controlador de vista y luego configuraste su alfa de vista en 1. Así que, lógicamente, debes descartar el controlador de vista después de la animación; Esto es realmente fácil usando bloques. El código sería algo como esto:

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

Esta línea de código anima alfa de la vista a 0, entonces (al finalizar) despide al controlador de vista presentado, y establece el alfa de la vista de nuevo a 1. Esta es una recíproca animación.

+0

Gracias, pero tanto usted como H2CO3 están ignorando el hecho de que hay una parte withDuration en mi código. Con el código reducido, no hay forma de establecer cuánto tiempo debería tomar el desvanecimiento de entrada/salida. Y mi publicación dice "... pero no durante un período de tiempo". Disculpas, mi título quizás debería haber dicho cómo lograr atenuarse Y controlar su duración, pero pensé que era obvio desde el código publicado y la descripción, lo siento si no fuera así. – Gruntcakes

+0

Editado en respuesta al comentario – NJones

+4

Parece que en iOS8 necesita agregar self.modalTransitionStyle = UIModalTransitionStyleCrossDissolve también en la presentación de ViewController, por lo que descartar también CrossDissolve –

9

En los documentos de UIViewController, podemos encontrar:

@property(nonatomic, assign) UIModalTransitionStyle modalTransitionStyle 

Establezca esta propiedad en UIModalTransitionStyleCrossDissolve y se disolverá correctamente :)

Espero que ayude.

+0

Gracias, se disuelve, pero lo hace de inmediato, mientras que tengo una animación de .5 segundos en su apariencia. ¿Cómo puedo hacer que se disuelva lentamente? – Gruntcakes

+0

[ self.parentViewController dismissModalViewControllerAnimated: YES]; –

+0

Configuración de animación: a YES hace que se desplace, configurando Animated: a NO hace que se disuelva, pero aún de inmediato. He publicado mi último código en una edición anterior. – Gruntcakes

0

Supongo que esto podría ser útil para los tipos heroicos, que aún intentan usar MPMoviePeterViewController en modo de pantalla completa y con orientación, que difiere de la aplicación principal.

He pasado literalmente la mitad del día de trabajo jugando con la presentación de MPMoviePlayerViewController de forma modal o no. Pero no hay suerte con eso, en el sentido de cambio de animación de transición. (El modo modal necesario para establecer la orientación que difiere de la orientación principal de la aplicación).

Probé presentViewController o presentModalViewController, pero el resultado es el mismo. No importa de qué tipo sea la propiedad modalTransitionStyle establecida, si hago [... dismissViewControllerAnimated: true ...], entonces el estilo de transición predeterminado (UIModalTransitionStyleCoverVertical) se usa de todos modos. Lo probé en dispositivos iOS 5.1 y en iOS 6 Simulator.

No he probado ningún otro tipo de controladores ...Teniendo en cuenta que el controlador común tiene el método dismissMoviePlayerViewControllerAnimated, puedo suponer que este método se usa de todos modos para descartar un controlador de video, sin importar cómo apareció. (Introducción de las transiciones no funcionaron para mí también, excepto que no procesan como CoverVertical (en caso de cambio de modalTransitionStyle).

lo tanto, mi solución fue no utilizar la animación de transición en absoluto. estoy seguro Apple tenía algunas razones para permitir solo algunas animaciones definidas para MovieViewController (realmente lo espero, y eso no se hizo por "pereza"), pero si querían una experiencia agradable, el usuario obtendría, fallaron, como en mi aplicación que es aún mejor cuando el video aparece sin animación (lo que es peor que CrossDisolving) pero eso es mejor que banal CoverVertical.

Visto desde el desarrollador de p Desde un punto de vista, realmente parece que gastan mucho más dinero para que los diseñadores pinten iconos agradables para los clientes en lugar de un trabajo más agradable y efectivo de los desarrolladores. (

Cuestiones relacionadas