iOS: Modal ViewController com fundo transparente


180

Estou tentando apresentar um controlador de exibição modalmente, com um fundo transparente. Meu objetivo é permitir que a exibição dos controladores de exibição e de apresentação seja exibida ao mesmo tempo. O problema é que, quando a animação de apresentação termina, a visão do controlador de exibição desaparece.

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

Sei que poderia adicionar a visualização como uma subvisão, mas gostaria de evitar essa solução por algum motivo. Como eu poderia consertar isso?


4
@TheKing Parece que Michael, assim como eu, quer que a visão modal seja translúcida, apareça como uma camada de gel pairando sobre a visão primária (de apresentação). Cria a sensação de o usuário permanecer no contexto atual enquanto faz uma configuração rápida, em vez de usar outras funcionalidades importantes (em uma exibição separada).
Basil Bourque 26/09

Este stackoverflow.com/q/27598846/1603234 me fazer sorrir, agora a sua vez :)
Hemang

Veja minha resposta aqui stackoverflow.com/a/29794201/1606125 para iOS 8
Pankaj Wadhwa


1
Para o iOS 10, o UIModalPresentationOverFullScreen está funcionando como inigo333 mencionado abaixo.
Josef Rysanek

Respostas:


97

Este código a seguir funciona apenas no iPad.

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

Eu adicionaria uma sub-visualização.

Aqui está uma discussão muito boa. Veja os comentários especificamente. Não é só a resposta.

Vista Modal

Se eu fosse você, não faria isso. Eu adicionaria uma subvisualização e o faria. Parece me dar um melhor controle sobre as coisas.

EDITAR:

Conforme mencionado por Paul Linsay, desde o iOS 8 tudo o que é necessário é UIModalPresentationOverFullScreenque o modalPresentationStyle do ViewController seja apresentado. Isso também abrangeria os botões navigationBar e tabBar.


18
Ele faz o trabalho no iOS 7 e também no iPhone, a coisa é que você tem que especificar o modalPresentationStyle = UIModalPresentationCurrentContextsobre o apresentador controlador de vista, e não no apresentado um.
precisa saber é o seguinte

6
Sim, funciona, mas SOMENTE se você definir isso na parte superior ViewController da hierarquia de exibição. (por exemplo, a NavigationControllerou a instância do seu controlador de exibição de menu de slides, por exemplo).
IGranDav

4
Estranhamente, no meu caso, só funcionou depois de definir o estilo modal para UIModalPresentationCustom, e somente se ele estiver definido antes presentViewControllere não em viewDidLoad.
Mojuba

5
Como o iOS 8, tudo o que é necessário é UIModalPresentationOverFullScreen para o modalPresentationStyle do ViewController sendo apresentado.
Paul Linsay

1
Após cerca de 1000 tentativas, percebi que você precisava definir modalPresentationStyle antesviewDidLoad . Eu fiz isso no construtor e funcionou.
precisa saber é o seguinte

186

Para aqueles que tentam fazer isso funcionar no iOS 8, a maneira "aprovada pela Apple" de exibir um controlador de exibição modal transparente é configurando modalPresentationStyle no atual controlador ed para UIModalPresentationOverCurrentContext.

Isso pode ser feito no código ou definindo as propriedades das segue no storyboard.

Na documentação do UIViewController:

UIModalPresentationOverCurrentContext

Um estilo de apresentação em que o conteúdo é exibido apenas sobre o conteúdo do controlador de exibição pai. As visualizações abaixo do conteúdo apresentado não são removidas da hierarquia de visualizações quando a apresentação termina. Portanto, se o controlador de exibição apresentado não preencher a tela com conteúdo opaco, o conteúdo subjacente será exibido.

Ao apresentar um controlador de exibição em um popover, esse estilo de apresentação é suportado apenas se o estilo de transição for UIModalTransitionStyleCoverVertical. Tentar usar um estilo de transição diferente aciona uma exceção. No entanto, você pode usar outros estilos de transição (exceto a transição de curvatura parcial) se o controlador de exibição pai não estiver em um popover.

Disponível no iOS 8.0 e posterior.

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

O vídeo 'Ver avanços do controlador no iOS 8' da WWDC 2014 aborda isso com mais detalhes.

Nota:

  • Certifique-se de dar ao seu controlador de exibição apresentado uma cor de fundo clara, para que não seja realmente transparente!
  • Você tem que definir isso antes de apresentar ou seja, definir este parâmetro na viewDidLoaddo presentedViewController não terá qualquer efeito

32
Nota - Parece que o destino em que você precisa definir modalPresentationStyle foi alterado. Por exemplo, no iOS 7, para que isso funcionasse, eu precisava definir o modalPresentationStyle do (s) View (s) Controller (s) que estavam tentando abrir o modal para UIModalPresentationCurrentContext . No entanto, para que isso funcione no iOS8, eu precisava definir o modalPresentationStyle da visualização modal que será exibida como UIModalPresentationOverCurrentContext .
U2Fan

1
Se você usar segues em seus storyboards, precisará definir o estilo de apresentação lá. Pelo menos é isso que funcionou para mim.
Julian B.

Adicionei estas três linhas no método init no controlador de exibição apresentado e funciona como um encanto: self.providesPresentationContextTransitionStyle = YES; self.definesPresentationContext = YES; [self setModalPresentationStyle: UIModalPresentationOverCurrentContext];
Inigo333 31/03

2
No iOS 8 ou superior, eu precisava apresentar um modal a partir de um UINavigationController, de modo que a apresentação de uma criança não me forneceu o que eu precisava. Em vez disso, sourceVCé self.navigationController. Além disso, somente após definir o estilo de apresentação de destino como personalizado, eu pude ver através dele. [sourceVC setModalPresentationStyle:UIModalPresentationCurrentContext];, [targetVC setModalPresentationStyle:UIModalPresentationCustom];Espero que ajude alguém.
Devdc 17/05/19

Nota - Ligue presentedVC.modalPresentationStyle = UIModalPresentationOverCurrentContextno VC de apresentação . Não funciona no CV apresentado. Confie em mim, eu tentei.
smileham

104

No iOS 8.0 e superior, isso pode ser feito configurando a propriedade modalPresentationStyle como 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 imagem anexada


5
Esta é a única solução que consegui trabalhar. Muito simples também. Basta adicionar isso ao seu VC de apresentação antes que o modal siga.
Siriss

1
Xcoe 9.2 / iOS 11.2 rápido .custome .overFullScreenfuncional.
William Hu

E parece que se você definir .overFullScreeno modo de exibição atual, o controlador viewWillAppearnão será chamado.
William Hu

Mais uma coisa, presentedController.view.backgroundColor = #color#deve ser escrita em presentedController's viewDidLoad, ou então presentedControllera vida é interrompida.
DawnSong

44

Esse código funciona bem no iPhone em iOS6 e iOS7:

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

Nesse caso, você perde a animação deslizante. Para manter a animação, você ainda pode usar a seguinte extensão "não elegante":

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

Se nossa apresentaçãoV estiver localizada dentro do UINavigationController ou UITabbarController, você precisará operar com esses controladores como apresentandoVC.

Além disso, no iOS7, você pode implementar a animação de transição personalizada, aplicando o UIViewControllerTransitioningDelegateprotocolo. Claro, neste caso, você pode obter um fundo transparente

@interface ModalViewController : UIViewController <UIViewControllerTransitioningDelegate>

Primeiro, antes de apresentar, você deve definir modalPresentationStyle

modalViewController.modalPresentationStyle = UIModalPresentationCustom;

Então você tem que implementar dois 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;
}

A última coisa é definir sua transição personalizada na CustomAnimatedTransitioningclasse

@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
    }
}

7
Confirmado que isso funciona. Observe que, se o seu viewController estiver dentro de um navigationController, verifique modalPresentationStyletambém se está definido!
Mxcl

Penso que, nos casos mais comuns, é uma boa ideia tratar o seu controlador de navegação como apresentando CV.
perfil completo de malex

Sim, usando este modalPresentationStyle impossível obter a apresentação de animação ((
malex 14/01

2
@alex sim, desculpe: meu erro foi definir modalPresentationStyle como UIModalPresentationCurrentContext para o CV apresentado, em vez do prenstingVC.
tiguero 26/01

5
@mxcl E se o seu navigationController de viewController é por si só dentro de um tabBarController em seguida, garantir a sua modalPresentationStyle está definido também;)
Thomas CG de Vilhena

21

Eu lutei um pouco com o Interface Builder do XCode 7 para definir o estilo de apresentação como o @VenuGopalTewari sugerido. Nesta versão, parece não haver Over Current Contextou Over Full Screenmodo de apresentação para o segue. Assim, para fazê-lo funcionar, defino o modo para Default:

insira a descrição da imagem aqui com insira a descrição da imagem aqui

Além disso, defino o modo de apresentação do controlador de exibição apresentado modalmente para Over Full Screen:

insira a descrição da imagem aqui


Isso funcionou para mim, nenhum código necessário. Eu estou usando o Xcode 7.2, swift e o alvo é o iOS 8.0
LightMan 15/02/16

Isso funcionou para mim também. +1 para a resposta correta. Obrigado :)
Augustine PA

Melhor resposta aqui!
shinyuX

1
Sem código = Melhor resposta. Bastian vence este jogo. Plz todos +1 esta resposta.
GeneCode 12/01

Esta resposta funcionou .. gastando mais de uma hora nisto
user578386 28/06/19

18

Crie um segue para apresentar modalmente e defina a propriedade Presentation desse segue para o contexto atual, ele funcionará 100%

insira a descrição da imagem aqui


3
Admiro os 100% garantidos, funcionou! A chave é aplicá-lo no segue. Muito obrigado
Badr

Se você não tiver o seu segue ligada a um botão e você está chamando-o de forma programática, em seguida, certifique-se definir um identificador e chamar performSegueWithIdentifier vez de presentViewController
user3344977

1
Eu tentei todas as outras respostas, mas esta é a única que funcionou para mim no iOS9.
endavid 20/03/16

14

PresentViewController com plano de fundo transparente - no 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];

E no MYViewController defina a cor de fundo em preto e reduza a opacidade


12

É um pouco hacky, mas para mim esse 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 também funciona no iPhone


Obrigado - é exatamente isso que eu precisava - mostrando uma tela inicial de "Ajuda" na parte superior da Página inicial principal. Lindo!
Matt H

1
Hoje, passo quase 3 horas navegando e procurando uma solução que funcione para iOS7 e iOS8. Considerando que esta resposta tem 1,5 anos e estou usando o ECSlidingViewController, esta é a única solução que funcionou! Obrigado @Mak.
Centurion

Perfeito. Além disso, se você não se importa com a animação, as três linhas na conclusão interna funcionam perfeitamente Obrigado!
RasTheDestroyer

depois de 3 horas gastas sem nenhum sucesso, achei isso, felicidades, gostaria de poder votar mais: D
alessioarsuffi

11

Esta categoria funcionou para mim (iOS 7, 8 e 9)

Arquivo H

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

Arquivo 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
Eu verifiquei toda a resposta .. mas para mim sua resposta é um trabalho perfeito .. "+1" para isso. @Ted
g212gs 14/10

1
Eu pensei que não poderia encontrar uma solução. Muito obrigado!
CopperCash

10

A solução para esta resposta usando o swift seria a seguinte.

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

9

Se você estiver usando o Storyboard, poderá seguir esta etapa:

  1. Adicione um controlador de exibição (V2), configure a interface do usuário da maneira que desejar
  • adicione um UIView - defina o plano de fundo para preto e a opacidade para 0,5
  • adicione outro UIView (2) - que servirá como pop-up (observe que o UIView e o UIView (2) devem ter o mesmo nível / hierarquia. Não faça da visualização de imagens o filho da visualização, caso contrário, a opacidade do uiview afetar o UIView (2))
  1. Present V2 Modally

  2. Clique no segue. No inspetor Atributos, defina a apresentação como em tela inteira . Remova a animação, se quiser

Storyboard

  1. Selecione V2. No inspetor Atributos, defina a apresentação como em tela inteira . A verificação define o contexto e fornece o contexto

Storyboard

  1. Selecione o MainView do seu V2 (Pls. Verifique a imagem). Definir backgroundColor para Clear Color

Storyboard


6

Adicionei essas três linhas no método init no controlador de exibição apresentado e funciona como um encanto:

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

EDIT (trabalhando no iOS 9.3):

self.modalPresentationStyle = UIModalPresentationOverFullScreen;

Conforme documentação:

UIModalPresentationOverFullScreen Um estilo de apresentação de exibição no qual a exibição apresentada cobre a tela. As visualizações abaixo do conteúdo apresentado não são removidas da hierarquia de visualizações quando a apresentação termina. Portanto, se o controlador de exibição apresentado não preencher a tela com conteúdo opaco, o conteúdo subjacente será exibido.

Disponível no iOS 8.0 e posterior.


1
Trabalhando no iOS 10.2.
Josef Rysanek

4

Uma maneira alternativa é usar uma "exibição de contêiner". Basta fazer alfa abaixo de 1 e incorporar com seque. XCode 5, destino iOS7. Testado no iPhone.

insira a descrição da imagem aqui

Visualização de contêiner disponível no iOS6. Link para postagem no blog sobre isso.


3

Eu criei um objeto para lidar com a apresentação do que chamo de "modal sobreposto", o que significa que ele mantém a visão do plano de fundo e permite que você tenha um modal com um plano de fundo transparente.

Ele tem um método único e simples que faz isso:

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

É importante definir a modalPresentationCapturesStatusBarAppearancepropriedade YESe forçar a atualização da aparência da barra de status, se o seu controlador de exibição apresentado tiver um diferente preferredStatusBarStyle.

Este objeto deve ter um @property (assign, nonatommic) isPresenting

Você quer que esse objeto para cumprir as UIViewControllerAnimatedTransitioninge UIViewControllerTransitioningDelegateprotocolos e implementar os seguintes métodos:

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

    return self;
}

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

    return self;
}

e:

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

Isso faz uma animação slide-in-the-bottom imitando a animação modal padrão, mas você pode fazer o que quiser.

O importante é que a visualização do controlador de exibição em apresentação permaneça na parte de trás, permitindo criar um efeito transparente.

Esta solução funciona para iOS 7 ou superior


Obrigado pela sua resposta.
Salman Khakwani 28/03

3

Uma maneira muito simples de fazer isso (usando Storyboards, por exemplo) é:

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

Isso apresentará um UIViewControllermodo Storyboardmodal, mas com um fundo translúcido.


3

Trabalhando 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 as boas respostas e comentários aqui e ainda ter uma animação ao passar para o seu novo, ViewControllerfoi o que eu fiz: (Suporta iOS 6 e superior)

Se você estiver usando um UINavigationController\, UITabBarControllereste é o caminho 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];

Se você fizer isso, perderá sua modalTransitionStyleanimação. Para resolvê-lo, você pode adicionar facilmente à sua SomeViewControllerturma o seguinte:

-(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

Claro que você deve definir UIModalPresentationCurrentContext, mas o local para definir clearColor também é muito importante! Você não pode definir o plano de fundo na função viewDidLoad, configurá-lo antes do carregamento da visualização, como no controlador de visualização raiz ou na função init do controlador que será apresentada!

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

ou

- (instancetype)init {

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

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

    return self;
}

Essa foi a dica que me ajudou entre todas as outras. Obrigado pela ajuda.
Tomasz Nazarenko

1

Se você estiver usando segue modal, defina-o como esta imagem (você pode desativar a animação, se desejar)insira a descrição da imagem aqui


1

Um método completo testado no iOS 7 e 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

no appdelegate:

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

no seu primeiro controlador de visualização de onde você deve carregar a próxima visualização:

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

    }];

no seu nextViewController, que deve ser adicionado 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

A tela de login é um modal, o que significa que fica na parte superior da tela anterior. Até agora, temos o fundo desfocado, mas não está desfocando nada; é apenas um fundo cinza.

Precisamos configurar nosso Modal corretamente.

destino do link da imagem

  • Primeiro, precisamos alterar o plano de fundo Exibir do controlador de exibição para Cor clara. Significa simplesmente que deve ser transparente. Por padrão, esse modo de exibição é branco.

  • Segundo, precisamos selecionar o Segue que leva à tela de Logon e, no Inspetor de Atributos, definir a Apresentação como Contexto Atual. Esta opção está disponível apenas com as Classes de layout e tamanho automáticas ativadas.

destino do link da imagem


0

Defina a navegação modalPresentationStylecomoUIModalPresentationCustom

e defina a cor de fundo do controlador de exibição apresentado como cor clara.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.