present modally modal ios uiviewcontroller modalviewcontroller custom-transition

ios - swift 4 present modally



Presente un UIViewController modal transparente (6)

Creo que lo que estás viendo es el comportamiento predeterminado de iOS.

Se supone que los controladores de vista no son opacos cuando se presentan como controladores de vista modal. iOS quita el controlador de vista subyacente cuando se completa la animación, con el fin de acelerar la composición cuando se supone que el controlador de vista presentado ocupe toda la pantalla. No hay ninguna razón para dibujar un controlador de vista, que podría ser complejo en su jerarquía de vista, cuando ni siquiera es visible en la pantalla.

Creo que tu única solución es hacer una presentación personalizada.

Observación: No probé esto. Pero dice algo como esto.

/* Create a window to hold the view controller. */ UIWindow *presenterWindow = [[UIWindow alloc] init]; /* Make the window transparent. */ presenterWindow.backgroundColor = [UIColor clearColor]; presenterWindow.opaque = NO; /* Set the window rootViewController to the view controller you want to display as a modal. */ presenterWindow.rootViewController = myModalViewController; /* Setup animation */ CGRect windowEndFrame = [UIScreen mainScreen].bounds; CGRect windowStartFrame = windowEndFrame; /* Adjust the start frame to appear from the bottom of the screen. */ windowStartFrame.origin.y = windowEndFrame.size.height; /* Set the window start frame. */ presenterWindow.frame = windowStartFrame; /* Put the window on screen. */ [presenterWindow makeKeyAndVisible]; /* Perform the animation. */ [UIView animateWithDuration:0.5 delay:.0 options:UIViewAnimationOptionCurveEaseOut animations:^{ presenterWindow.frame = windowEndFrame; } completion:^(BOOL finished){ /* Your transition end code */ }];

Sin embargo, esto no le deja la opción de usar cualquiera de las compilaciones de la lógica del controlador de vista presentado en UIViewController . Tendrá que figurarse a usted mismo, cuando el controlador de vista presentado esté listo, y luego invertir la animación y eliminar la UIWindow de UIWindow de la pantalla.

Estoy tratando de hacer una alerta de vista personalizada (para iOS7 +) por mi cuenta, pero me cuesta la presentación de alertView.

Tengo un UIViewController con un fondo negro (alfa configurado en 0.25f) y un alertView como subvista.

Cuando quiero mostrar el alertView, presento modally el viewController:

-(void) show { UIWindow* window = [[UIApplication sharedApplication] keyWindow]; self.modalTransitionStyle = UIModalPresentationCustom; self.transitioningDelegate = self; [window.rootViewController presentViewController:self animated:YES completion:nil]; }

Y aquí está mi objeto animador:

-(NSTimeInterval) transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext { NSLog(@"%s",__PRETTY_FUNCTION__); return 2; } -(void) animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext { NSLog(@"%s",__PRETTY_FUNCTION__); UIView* toView = [transitionContext viewForKey:UITransitionContextToViewKey]; toView.alpha = 0; UIView* container = [transitionContext containerView]; [container addSubview:toView]; [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{ toView.alpha = 0.5; } completion:^(BOOL finished) { [transitionContext completeTransition:YES]; }]; }

El asunto es que el VC modal se está desvaneciendo con el VC que se presenta en el fondo como se supone que tiene que hacer, pero cuando finaliza la animación, el VC que lo presenta se elimina del fondo.

Si llamo [transitionContext completeTransition:YES]; en cambio, el VC presentador está en segundo plano pero el VC modal se elimina al final de la animación, por lo que supongo que el contexto cancela la presentación si enviamos ''NO''.

¿Hay alguna manera de mantener el VC que se presenta en segundo plano sin tener que hacer una instantánea del mismo y establecerlo como fondo de la vista del VC modal?


Se supone que ViewController no es transparente cuando lo presenta o lo empuja. Puede intentar agregarlo como subvista. Y para el efecto de transición, cambie su marco inmediatamente después de agregar como subvista. Haga su marco en algún lugar fuera de la vista visible y luego anímelo para cambiar el marco a la vista visible.

Espero que esto ayude.


Para su información, finalmente hice mi alerta personalizada Vea una subclase de UIView para la "parte emergente". Para mostrarlo, simplemente agrego el alertView como subvista de la keyWindow con las restricciones para centrarlo, y coloco una vista de fondo negra transparente detrás de él.

Como no es un controlador, tengo que administrar la rotación de IU por mi cuenta (solo para iOS 7, rota bien con la IU en iOS 8).


Intenté esta solución y funciona tanto en iOS 7 como en 8:

if ([[UIDevice currentDevice].systemVersion integerValue] >= 8) { //For iOS 8 presentingViewController.providesPresentationContextTransitionStyle = YES; presentingViewController.definesPresentationContext = YES; presentedViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext; } else { //For iOS 7 presentingViewController.modalPresentationStyle = UIModalPresentationCurrentContext; }

Nota: Tenga en cuenta la diferencia entre '' presentingViewController '' y '' presentedViewController ''.


Mi caso puede diferir del tuyo, pero la información puede ser útil para la conversación.

En Storyboard, cambié la presentación de mi segue para indicar "Over Full Screen" y funcionó.


iOS8 +

Para iOS8 + puedes usar el siguiente fragmento de código

SecondViewController *secondViewController = [[SecondViewController alloc] init]; secondViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext; [self presentViewController:secondViewController animated:YES completion:nil];