iOS: Modal ViewController con fondo transparente


180

Estoy tratando de presentar un controlador de vista modalmente, con un fondo transparente. Mi objetivo es permitir que tanto la vista de los controladores de presentación como la vista presentada se muestren al mismo tiempo. El problema es que, cuando finaliza la animación de presentación, la vista del controlador de vista de presentación desaparece.

- (IBAction)pushModalViewControllerButtonPressed:(id)sender
{
    ModalViewController *modalVC = [[ModalViewController alloc] init];
    [self presentViewController:modalVC animated:YES completion:nil];
}

Sé que podría agregar la vista como una subvista, pero me gustaría evitar esta solución por alguna razón. ¿Cómo podría arreglarlo?


44
@TheKing Suena como Michael, como yo, quiere que la vista modal sea translúcida, que aparezca como una capa de gel flotando sobre la vista primaria (presentación). Crea la sensación de que el usuario permanece en el contexto actual mientras realiza una configuración rápida, en lugar de recurrir a alguna otra funcionalidad importante (en una vista separada).
Basil Bourque

Este stackoverflow.com/q/27598846/1603234 me hace sonreír, ahora es tu turno :)
Hemang

Vea mi respuesta aquí stackoverflow.com/a/29794201/1606125 para iOS 8
Pankaj Wadhwa


1
Para iOS 10 funciona UIModalPresentationOverFullScreen como inigo333 mencionado a continuación.
Josef Rysanek

Respuestas:


97

El siguiente código solo funciona en el iPad.

self.view.backgroundColor = [UIColor clearColor];
self.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentModalViewController:modalVC animated:YES];

Me gustaría agregar una vista secundaria.

Aquí hay una muy buena discusión. Mira los comentarios específicamente. No solo la respuesta.

Vista modal

Si yo fuera tú, no lo haría. Agregaría una vista secundaria y lo haría. Parece darme un mejor control sobre las cosas.

EDITAR:

Como mencionó Paul Linsay, desde iOS 8 todo lo que se necesita es UIModalPresentationOverFullScreenpara el modalPresentationStyle del ViewController que se presenta. Esto también cubriría los botones navigationBar y tabBar.


18
Se hace el trabajo en iOS 7 y también en el iPhone, la cosa es que usted tiene que especificar el modalPresentationStyle = UIModalPresentationCurrentContextde la presentadora controlador de vista, y no en el presentado uno.
redent84

66
Sí, funciona, pero SOLO si configura esto en la jerarquía superior ViewController de su vista. (por ejemplo, a NavigationControllero la instancia de su controlador de vista de menú deslizante, por ejemplo).
iGranDav

44
Curiosamente, en mi caso, solo funcionó después de establecer el estilo modal en UIModalPresentationCustom, y solo si se establece justo antes en presentViewControllerlugar de hacerlo en viewDidLoad.
mojuba

55
Desde iOS 8, todo lo que se necesita es UIModalPresentationOverFullScreen para el modalPresentationStyle del ViewController que se presenta.
Paul Linsay

1
Después de aproximadamente 1000 intentos, me di cuenta de que debes configurarlo modalPresentationStyle antesviewDidLoad . Lo hice en el constructor y funcionó.
bendytree

186

Para aquellos que intentan que esto funcione en iOS 8, la forma "aprobada por Apple" de mostrar un controlador de vista modal transparente es configurando modalPresentationStyle el controlador ed actual en UIModalPresentationOverCurrentContext.

Esto se puede hacer en código o configurando las propiedades de la secuencia en el guión gráfico.

De la documentación de UIViewController:

UIModalPresentationOverCurrentContext

Un estilo de presentación donde el contenido se muestra solo sobre el contenido del controlador de vista principal. Las vistas debajo del contenido presentado no se eliminan de la jerarquía de vistas cuando finaliza la presentación. Entonces, si el controlador de vista presentado no llena la pantalla con contenido opaco, el contenido subyacente se muestra a través.

Al presentar un controlador de vista en una ventana emergente, este estilo de presentación solo se admite si el estilo de transición es UIModalTransitionStyleCoverVertical. Intentar usar un estilo de transición diferente desencadena una excepción. Sin embargo, puede usar otros estilos de transición (excepto la transición de curvatura parcial) si el controlador de vista principal no está en una ventana emergente.

Disponible en iOS 8.0 y posterior.

https://developer.apple.com/documentation/uikit/uiviewcontroller

El video 'View Controller Advancements in iOS 8' de WWDC 2014 entra en esto con cierto detalle.

Nota:

  • ¡Asegúrese de darle a su controlador de vista presentado un color de fondo claro, para que no sea realmente transparente!
  • Debe configurar esto antes de presentar, es decir, configurar este parámetro en el viewDidLoaddel PresentViewController no tendrá ningún efecto

32
Nota: Parece que el objetivo donde necesita establecer modalPresentationStyle ha cambiado. Por ejemplo, en iOS 7, para que esto funcione, necesitaba establecer el modalPresentationStyle de los controladores de vista que intentaba abrir el modal en UIModalPresentationCurrentContext . Sin embargo, para que esto funcione en iOS8, necesitaba establecer el modalPresentationStyle de la vista modal que se mostrará en UIModalPresentationOverCurrentContext .
u2Fan

1
Si usa segues en sus guiones gráficos, debe establecer el estilo de presentación allí. Al menos esto es lo que funcionó para mí.
Julian B.

Agregué estas tres líneas en el método init en el controlador de vista presentado, y funciona de maravilla: self.providesPresentationContextTransitionStyle = YES; self.definesPresentationContext = YES; [self setModalPresentationStyle: UIModalPresentationOverCurrentContext];
inigo333

2
En iOS 8+, tuve que presentar un modal desde un UINavigationController, por lo que presentar desde un niño no me proporcionó lo que necesitaba. En cambio, sourceVCes self.navigationController. Además, solo después de configurar el estilo de presentación de destino como personalizado, pude ver a través de él. [sourceVC setModalPresentationStyle:UIModalPresentationCurrentContext];, [targetVC setModalPresentationStyle:UIModalPresentationCustom];Es de esperar que ayude a alguien.
devdc

Nota - Llame presentedVC.modalPresentationStyle = UIModalPresentationOverCurrentContexten la presentación de VC. No funciona en el presentado CV. Confía en mí, lo intenté.
smileham

104

En iOS 8.0 y superior se puede hacer estableciendo la propiedad modalPresentationStyle en UIModalPresentationOverCurrentContext

//Set property **definesPresentationContext** YES to avoid presenting over presenting-viewController's navigation bar

self.definesPresentationContext = YES; //self is presenting view controller
presentedController.view.backgroundColor = [YOUR_COLOR with alpha OR clearColor]
presentedController.modalPresentationStyle = UIModalPresentationOverCurrentContext;

[self presentViewController:presentedController animated:YES completion:nil];

Ver imagen adjunta


55
Esta es la única solución que pude poner a trabajar. Muy simple también. Simplemente agregue esto a su VC de presentación antes de la secuencia modal.
Siriss

1
Xcoe 9.2 / iOS 11.2 rápido .customy .overFullScreenfunciona.
William Hu

Y parece que si configura .overFullScreenel controlador de vista actual viewWillAppearno se llamará.
William Hu

Una cosa más, presentedController.view.backgroundColor = #color#debe escribirse en presentedController's viewDidLoad, o de lo contrario presentedControllerla vida se interrumpe.
DawnSong

44

Este código funciona bien en iPhone con iOS6 e iOS7:

presentedVC.view.backgroundColor = YOUR_COLOR; // can be with 'alpha'
presentingVC.modalPresentationStyle = UIModalPresentationCurrentContext;
[presentingVC presentViewController:presentedVC animated:YES completion:NULL];

En este caso, se pierde la animación deslizante. Para conservar la animación, aún puede usar la siguiente extensión "no elegante":

[presentingVC presentViewController:presentedVC animated:YES completion:^{
    [presentedVC dismissViewControllerAnimated:NO completion:^{
        presentingVC.modalPresentationStyle = UIModalPresentationCurrentContext;
        [presentingVC presentViewController:presentedVC animated:NO completion:NULL];
    }];
}];

Si nuestro presentador V está ubicado dentro de UINavigationController o UITabbarController, debe operar con esos controladores como presentando VC.

Además, en iOS7 puede implementar un UIViewControllerTransitioningDelegateprotocolo de aplicación de animación de transición personalizada . Por supuesto, en este caso puedes obtener un fondo transparente

@interface ModalViewController : UIViewController <UIViewControllerTransitioningDelegate>

Primero, antes de presentar debes configurar modalPresentationStyle

modalViewController.modalPresentationStyle = UIModalPresentationCustom;

Entonces tienes que implementar dos métodos de protocolo

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
{
    CustomAnimatedTransitioning *transitioning = [CustomAnimatedTransitioning new];
    transitioning.presenting = YES;
    return transitioning;
}

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
    CustomAnimatedTransitioning * transitioning = [CustomAnimatedTransitioning new];
    transitioning.presenting = NO;
    return transitioning;
}

Lo último es definir tu transición personalizada en CustomAnimatedTransitioningclase

@interface CustomAnimatedTransitioning : NSObject <UIViewControllerAnimatedTransitioning>
@property (nonatomic) BOOL presenting;
@end

@implementation CurrentContextTransitionAnimator

- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext 
{
    return 0.25;
}

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext 
{
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    if (self.presenting) {
        // custom presenting animation
    }
    else {
        // custom dismissing animation
    }
}

77
Confirmado esto funciona. ¡OBSERVE que si su viewController está dentro de un navigationController, asegúrese modalPresentationStyletambién de que esté configurado!
mxcl

Creo que en los casos más comunes es una buena idea tratar su controlador de navegación como presentando un CV.
malex

Sí, usando este modalPresentationStyle imposible de obtener presentación de animación ((
malex

2
@alex sí, funciona, lo siento: mi error fue establecer modalPresentationStyle en UIModalPresentationCurrentContext para el PresentVC en lugar del prenstingVC.
tiguero

55
@mxcl Y si su viewController navigationController está dentro de un tabBarController, asegúrese también de que su modalPresentationStyle esté configurado;)
Thomas CG de Vilhena

21

Luché un poco con el Creador de interfaces de XCode 7 para establecer el Estilo de presentación como sugirió @VenuGopalTewari. En esta versión, no parece haber ninguna Over Current Contexto Over Full Screenmodo de presentación para el segue. Por lo tanto, para que funcione, configuré el modo en Default:

ingrese la descripción de la imagen aquí con ingrese la descripción de la imagen aquí

Además, configuré el modo de presentación del controlador de vista presentado modalmente en Over Full Screen:

ingrese la descripción de la imagen aquí


Esto funcionó para mí, no se necesita código. Estoy usando Xcode 7.2, rápido y el objetivo es iOS 8.0
LightMan

Esto funcionó para mí también. +1 para la respuesta correcta. Gracias :)
Augustine PA

¡La mejor respuesta aquí!
shinyuX

1
Sin código = La mejor respuesta. Bastian gana este juego. Por favor, haga +1 en esta respuesta.
GeneCode

Esta respuesta funcionó ... gastando más de una hora en esto
user578386

18

Cree un segue para presentar modalmente y establezca la propiedad Presentation de ese segue en el contexto actual funcionará al 100%

ingrese la descripción de la imagen aquí


3
Admiro a los 100% seguros, ¡funcionó! La clave es aplicarlo en el segue. Muchas gracias
Badr

Si no tiene su segue conectado a un botón y lo está llamando mediante programación, asegúrese de establecer un identificador y llamar a performSegueWithIdentifier en lugar de presentViewController
usuario3344977

1
Intenté todas las otras respuestas, pero esta es la única que funcionó para mí en iOS9.
endavid

14

PresentViewController con fondo transparente: en iOS 8 e iOS 9

MYViewController *myVC = [self.storyboard   instantiateViewControllerWithIdentifier:@"MYViewController"];
    myVC.providesPresentationContextTransitionStyle = YES;
    myVC.definesPresentationContext = YES;
    [myVC setModalPresentationStyle:UIModalPresentationOverCurrentContext];
    [self.navigationController presentViewController:myVC animated:YES completion:nil];

Y en MYViewController establece el color de fondo negro y reduce la opacidad


12

Es un poco hacky, pero para mí este código funciona (iOS 6):

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

[self presentViewController:self.signInViewController animated:YES completion:^{
    [self.signInViewController dismissViewControllerAnimated:NO completion:^{
        appDelegate.window.rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
        [self presentViewController:self.signInViewController animated:NO completion:nil];
        appDelegate.window.rootViewController.modalPresentationStyle = UIModalPresentationFullScreen;

    }];
}];

Este código también funciona en iPhone


Gracias, esto es exactamente lo que necesitaba, mostrando una pantalla inicial de "Ayuda" en la parte superior de la página principal. ¡Hermoso!
Matt H

1
Hoy, paso casi 3 horas buscando y buscando soluciones que funcionen tanto para iOS7 como para iOS8. Teniendo en cuenta el hecho de que esta respuesta tiene 1,5 años y estoy usando ECSlidingViewController, ¡esta es la única solución que funcionó! Gracias @Mak.
Centurion

Perfecto. Además, si no te importa la animación, las 3 líneas en la terminación interna funcionan perfectamente ¡Gracias!
RasTheDestroyer

después de pasar 3 horas sin éxito, encontré esto, aplausos, desearía poder votar más: D
alessioarsuffi

11

Esta categoría funcionó para mí (ios 7, 8 y 9)

Archivo H

@interface UIViewController (navigation)
- (void) presentTransparentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;
@end

Archivo M

@implementation UIViewController (navigation)
- (void)presentTransparentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
{
    if(SYSTEM_VERSION_LESS_THAN(@"8.0")) {
        [self presentIOS7TransparentController:viewControllerToPresent withCompletion:completion];

    }else{
        viewControllerToPresent.modalPresentationStyle = UIModalPresentationOverCurrentContext;
         [self presentViewController:viewControllerToPresent animated:YES completion:completion];
    }
}
-(void)presentIOS7TransparentController:(UIViewController *)viewControllerToPresent withCompletion:(void(^)(void))completion
{
    UIViewController *presentingVC = self;
    UIViewController *root = self;
    while (root.parentViewController) {
        root = root.parentViewController;
    }
    UIModalPresentationStyle orginalStyle = root.modalPresentationStyle;
    root.modalPresentationStyle = UIModalPresentationCurrentContext;
    [presentingVC presentViewController:viewControllerToPresent animated:YES completion:^{
        root.modalPresentationStyle = orginalStyle;
    }];
}
@end

1
Verifiqué toda la respuesta ... pero para mí tu respuesta es un trabajo perfecto ... "+1" para esto. @Ted
g212gs

1
Pensé que no podía encontrar una solución. ¡Muchas gracias!
CopperCash

10

La solución a esta respuesta usando swift sería la siguiente.

let vc = MyViewController()
vc.view.backgroundColor = UIColor.clear // or whatever color.
vc.modalPresentationStyle = .overCurrentContext
present(vc, animated: true, completion: nil)

9

Si está utilizando Storyboard, puede seguir este paso:

  1. Agregue un controlador de vista (V2), configure la interfaz de usuario de la manera que desee
  • agregue una UIView: configure el fondo en negro y la opacidad en 0.5
  • agregue otra UIView (2), que servirá como ventana emergente (tenga en cuenta que la UIView y la UIView (2) deben tener el mismo nivel / jerarquía. No haga que la vista de imagen sea el elemento secundario de la vista, de lo contrario, la opacidad de la uiview será afectar la UIView (2))
  1. Presente V2 modalmente

  2. Haga clic en el segue. En el inspector de atributos, establezca la presentación como en pantalla completa . Elimina la animación si quieres

Storyboard

  1. Selecciona V2. En el inspector de atributos, establezca la presentación como en pantalla completa . La verificación define el contexto y proporciona el contexto

Storyboard

  1. Seleccione el MainView de su V2 (Por favor, compruebe la imagen). Establecer backgroundColor en Clear Color

Storyboard


6

Agregué estas tres líneas en el método init en el controlador de vista presentado, y funciona de maravilla:

self.providesPresentationContextTransitionStyle = YES;
self.definesPresentationContext = YES;
[self setModalPresentationStyle:UIModalPresentationOverCurrentContext];

EDITAR (trabajando en iOS 9.3):

self.modalPresentationStyle = UIModalPresentationOverFullScreen;

Según la documentación:

UIModalPresentationOverFullScreen Un estilo de presentación de vista en el que la vista presentada cubre la pantalla. Las vistas debajo del contenido presentado no se eliminan de la jerarquía de vistas cuando finaliza la presentación. Entonces, si el controlador de vista presentado no llena la pantalla con contenido opaco, el contenido subyacente se muestra a través.

Disponible en iOS 8.0 y posterior.


1
Trabajando en iOS 10.2.
Josef Rysanek

4

Una forma alternativa es usar una "vista de contenedor". Simplemente haga alfa por debajo de 1 e incruste con la secuencia. XCode 5, objetivo iOS7. Probado en iPhone.

ingrese la descripción de la imagen aquí

Vista de contenedor disponible desde iOS6. Enlace a la publicación de blog sobre eso.


3

He creado un objeto para manejar la presentación de lo que yo llamo un "modal superpuesto", lo que significa que retiene la vista del fondo y le permite tener un modal con un fondo transparente.

Tiene un método único y simple que hace esto:

- (void)presentViewController:(UIViewController *)presentedViewController
       fromViewController:(UIViewController *)presentingViewController
{
    presentedViewController.modalPresentationStyle = UIModalPresentationCustom;
    presentedViewController.transitioningDelegate = self;
    presentedViewController.modalPresentationCapturesStatusBarAppearance = YES;

    [presentedViewController setNeedsStatusBarAppearanceUpdate];

    [presentingViewController presentViewController:presentedViewController
                                       animated:YES
                                     completion:nil];
}

Es importante establecer la modalPresentationCapturesStatusBarAppearancepropiedad YESy forzar la actualización de la apariencia de la barra de estado, si su controlador de vista presentado tiene un valor diferentepreferredStatusBarStyle .

Este objeto debe tener un @property (assign, nonatommic) isPresenting

¿Quieres este objeto de cumplir con las UIViewControllerAnimatedTransitioningy los UIViewControllerTransitioningDelegateprotocolos e implementar los métodos siguientes:

- (id)animationControllerForPresentedController:(UIViewController *)presented
                           presentingController:(UIViewController *)presenting
                               sourceController:(UIViewController *)source
{
    self.isPresenting = YES;

    return self;
}

- (id)animationControllerForDismissedController:(UIViewController *)dismissed
{
    self.isPresenting = NO;

    return self;
}

y:

- (NSTimeInterval)transitionDuration:(id)transitionContext
{
    return 0.25;
}

- (void)animateTransition:(id)transitionContext
{
    UIViewController* firstVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController* secondVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIView* containerView = [transitionContext containerView];
    UIView* firstView = firstVC.view;
    UIView* secondView = secondVC.view;

    if (self.isPresenting) {
        [containerView addSubview:secondView];
        secondView.frame = (CGRect){
            containerView.frame.origin.x,
            containerView.frame.origin.y + containerView.frame.size.height,
            containerView.frame.size
        };

        firstView.tintAdjustmentMode = UIViewTintAdjustmentModeDimmed;
        [UIView animateWithDuration:0.25 animations:^{
            secondView.frame = containerView.frame;
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
        } else {
        [UIView animateWithDuration:0.25 animations:^{
            firstView.frame = (CGRect){
                containerView.frame.origin.x,
                containerView.frame.origin.y + containerView.frame.size.height,
                containerView.frame.size
        };

        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
    }
}

Esto hace una animación de deslizamiento desde abajo que imita la animación modal predeterminada, pero puedes hacer lo que quieras.

Lo importante es que la vista del controlador de vista de presentación permanecerá en la parte posterior, permitiéndole crear un efecto transparente.

Esta solución funciona para iOS 7+


Gracias por tu respuesta.
Salman Khakwani

3

Una forma muy simple de hacer esto (usando Storyboards, por ejemplo) es:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SomeStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SomeStoryboardViewController"];
// the key for what you're looking to do:
vc.modalPresentationStyle = UIModalPresentationOverCurrentContext;
vc.view.alpha = 0.50f;

[self presentViewController:vc animated:YES completion:^{
    // great success
}];

Esto presentará una UIViewControllerforma Storyboardmodal, pero con un fondo translúcido.


3

Trabajando para iOS 7-10

if #available(iOS 8.0, *) {
    nextVC.modalPresentationStyle = .OverCurrentContext
    self.presentViewController(nextVC, animated: true, completion: nil)
} else {
    // Fallback on earlier version
    self.modalPresentationStyle = .Custom          
    nextVC.modalTransitionStyle = .CrossDissolve            
    self.presentViewController(nextVC, animated: false, completion: nil)
    }
}

2

Para recapitular todas las buenas respuestas y comentarios aquí y seguir teniendo una animación mientras te mueves a la nueva, ViewControlleresto es lo que hice: (Compatible con iOS 6 y superior)

Si está utilizando un UINavigationController\ UITabBarControllereste es el camino a seguir:

    SomeViewController *vcThatWillBeDisplayed = [self.storyboard instantiateViewControllerWithIdentifier:@"SomeVC"];

    vcThatWillBeDisplayed.view.backgroundColor = [UIColor colorWithRed: 255/255.0 green:255/255.0 blue:255/255.0 alpha:0.50];    

    self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentViewController:presentedVC animated:YES completion:NULL];

Si lo haces, perderás tu modalTransitionStyleanimación. Para resolverlo, puede agregar fácilmente a su SomeViewControllerclase esto:

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [UIView animateWithDuration:0.4 animations:^() {self.view.alpha = 1;}
       completion:^(BOOL finished){}];
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.alpha = 0;
}

2

Por supuesto, debe configurar UIModalPresentationCurrentContext, ¡pero el lugar para establecer clearColor también es muy importante! ¡No puede establecer el fondo en la función viewDidLoad, configúrelo antes de que la vista se cargue como en el controlador de vista raíz o en la función init del controlador que se presentará!

actionController.view.backgroundColor = [UIColor clearColor];
[self presentViewController:actionController animated:YES completion:nil];

o

- (instancetype)init {

    self = [super initWithNibName:nil bundle:nil];

    if(self) {
        self.modalPresentationStyle = UIModalPresentationOverCurrentContext;
        [self.view setBackgroundColor:[UIColor clearColor]];
    }

    return self;
}

Esta fue la pista que me ayudó entre todos los demás. Gracias por tu ayuda.
Tomasz Nazarenko

1

Si está utilizando modal segue, asegúrese de configurarlo como esta imagen (puede desactivar la animación si lo desea)ingrese la descripción de la imagen aquí


1

Un método completo probado en iOS 7 y iOS 8.

@interface UIViewController (MBOverCurrentContextModalPresenting)

/// @warning Some method of viewControllerToPresent will called twice before iOS 8, e.g. viewWillAppear:.
- (void)MBOverCurrentContextPresentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;

@end

@implementation UIViewController (MBOverCurrentContextModalPresenting)

- (void)MBOverCurrentContextPresentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {
    UIViewController *presentingVC = self;

    // iOS 8 before
    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1) {
        UIViewController *root = presentingVC;
        while (root.parentViewController) {
            root = root.parentViewController;
        }

        [presentingVC presentViewController:viewControllerToPresent animated:YES completion:^{
            [viewControllerToPresent dismissViewControllerAnimated:NO completion:^{
                UIModalPresentationStyle orginalStyle = root.modalPresentationStyle;
                if (orginalStyle != UIModalPresentationCurrentContext) {
                    root.modalPresentationStyle = UIModalPresentationCurrentContext;
                }
                [presentingVC presentViewController:viewControllerToPresent animated:NO completion:completion];
                if (orginalStyle != UIModalPresentationCurrentContext) {
                    root.modalPresentationStyle = orginalStyle;
                }
            }];
        }];
        return;
    }

    UIModalPresentationStyle orginalStyle = viewControllerToPresent.modalPresentationStyle;
    if (orginalStyle != UIModalPresentationOverCurrentContext) {
        viewControllerToPresent.modalPresentationStyle = UIModalPresentationOverCurrentContext;
    }
    [presentingVC presentViewController:viewControllerToPresent animated:YES completion:completion];
    if (orginalStyle != UIModalPresentationOverCurrentContext) {
        viewControllerToPresent.modalPresentationStyle = orginalStyle;
    }
}

@end

1

Swift 4.2

guard let someVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "someVC") as? someVC else {
    return
}
someVC.modalPresentationStyle = .overCurrentContext

present(someVC, animated: true, completion: nil)

0

en appdelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[_window rootViewController]setModalPresentationStyle:UIModalPresentationCurrentContext];
    return YES;
}

en su primer controlador de vista desde donde debe cargar la siguiente vista:

  NextViewController *customvc = [[NextViewController alloc]init];
    [self presentViewController:customvc animated:YES completion:^{

    }];

en su nextViewController que se agregará transparente:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor clearColor];
    UIView* backView = [[UIView alloc] initWithFrame:self.view.frame];
    backView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
    [self.view insertSubview:backView atIndex:0];
}

0

La pantalla de inicio de sesión es modal, lo que significa que se encuentra en la parte superior de la pantalla anterior. Hasta ahora tenemos fondo borroso, pero no está borrando nada; Es solo un fondo gris.

Necesitamos configurar nuestro Modal correctamente.

objetivo de enlace de imagen

  • Primero, necesitamos cambiar el fondo de Vista del Controlador de Vista a Color claro. Simplemente significa que debe ser transparente. Por defecto, esa Vista es blanca.

  • En segundo lugar, debemos seleccionar el Segue que conduce a la pantalla de inicio de sesión y, en el Inspector de atributos, establecer la presentación en Contexto sobre actual. Esta opción solo está disponible con el diseño automático y las clases de tamaño habilitadas.

objetivo de enlace de imagen


0

Establecer la navegación modalPresentationStyleaUIModalPresentationCustom

y configure el color de fondo del controlador de vista presentado como color claro.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.