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?
Respostas:
Este código a seguir funciona apenas no iPad.
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 é
UIModalPresentationOverFullScreen
que o modalPresentationStyle do ViewController seja apresentado. Isso também abrangeria os botões navigationBar e tabBar.fonte
modalPresentationStyle = UIModalPresentationCurrentContext
sobre o apresentador controlador de vista, e não no apresentado um.ViewController
da hierarquia de exibição. (por exemplo, aNavigationController
ou a instância do seu controlador de exibição de menu de slides, por exemplo).UIModalPresentationCustom
, e somente se ele estiver definido antespresentViewController
e não emviewDidLoad
.modalPresentationStyle
antesviewDidLoad
. Eu fiz isso no construtor e funcionou.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 paraUIModalPresentationOverCurrentContext
.Isso pode ser feito no código ou definindo as propriedades das segue no storyboard.
Na documentação do UIViewController:
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:
viewDidLoad
do presentedViewController não terá qualquer efeitofonte
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.presentedVC.modalPresentationStyle = UIModalPresentationOverCurrentContext
no VC de apresentação . Não funciona no CV apresentado. Confie em mim, eu tentei.No iOS 8.0 e superior, isso pode ser feito configurando a propriedade modalPresentationStyle como UIModalPresentationOverCurrentContext
fonte
.custom
e.overFullScreen
funcional..overFullScreen
o modo de exibição atual, o controladorviewWillAppear
não será chamado.presentedController.view.backgroundColor = #color#
deve ser escrita empresentedController
'sviewDidLoad
, ou entãopresentedController
a vida é interrompida.Esse código funciona bem no iPhone em iOS6 e iOS7:
Nesse caso, você perde a animação deslizante. Para manter a animação, você ainda pode usar a seguinte extensão "não elegante":
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
UIViewControllerTransitioningDelegate
protocolo. Claro, neste caso, você pode obter um fundo transparentePrimeiro, antes de apresentar, você deve definir
modalPresentationStyle
Então você tem que implementar dois métodos de protocolo
A última coisa é definir sua transição personalizada na
CustomAnimatedTransitioning
classefonte
modalPresentationStyle
também se está definido!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 Context
ouOver Full Screen
modo de apresentação para o segue. Assim, para fazê-lo funcionar, defino o modo paraDefault
:com
Além disso, defino o modo de apresentação do controlador de exibição apresentado modalmente para
Over Full Screen
:fonte
Crie um segue para apresentar modalmente e defina a propriedade Presentation desse segue para o contexto atual, ele funcionará 100%
fonte
PresentViewController com plano de fundo transparente - no iOS 8 e iOS 9
E no MYViewController defina a cor de fundo em preto e reduza a opacidade
fonte
É um pouco hacky, mas para mim esse código funciona (iOS 6):
Este código também funciona no iPhone
fonte
Esta categoria funcionou para mim (iOS 7, 8 e 9)
Arquivo H
Arquivo M
fonte
A solução para esta resposta usando o swift seria a seguinte.
fonte
Se você estiver usando o Storyboard, poderá seguir esta etapa:
fonte
Adicionei essas três linhas no método init no controlador de exibição apresentado e funciona como um encanto:
EDIT (trabalhando no iOS 9.3):
Conforme documentação:
Disponível no iOS 8.0 e posterior.
fonte
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.
Visualização de contêiner disponível no iOS6. Link para postagem no blog sobre isso.
fonte
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:
É importante definir a
modalPresentationCapturesStatusBarAppearance
propriedadeYES
e forçar a atualização da aparência da barra de status, se o seu controlador de exibição apresentado tiver um diferentepreferredStatusBarStyle
.Este objeto deve ter um
@property (assign, nonatommic) isPresenting
Você quer que esse objeto para cumprir as
UIViewControllerAnimatedTransitioning
eUIViewControllerTransitioningDelegate
protocolos e implementar os seguintes métodos:e:
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
fonte
Uma maneira muito simples de fazer isso (usando
Storyboards
, por exemplo) é:Isso apresentará um
UIViewController
modoStoryboard
modal, mas com um fundo translúcido.fonte
Trabalhando para iOS 7-10
fonte
Para recapitular todas as boas respostas e comentários aqui e ainda ter uma animação ao passar para o seu novo,
ViewController
foi o que eu fiz: (Suporta iOS 6 e superior)Se você estiver usando um
UINavigationController
\,UITabBarController
este é o caminho a seguir:Se você fizer isso, perderá sua
modalTransitionStyle
animação. Para resolvê-lo, você pode adicionar facilmente à suaSomeViewController
turma o seguinte:fonte
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!
ou
fonte
Se você estiver usando segue modal, defina-o como esta imagem (você pode desativar a animação, se desejar)
fonte
Um método completo testado no iOS 7 e iOS 8.
fonte
Swift 4.2
fonte
no appdelegate:
no seu primeiro controlador de visualização de onde você deve carregar a próxima visualização:
no seu nextViewController, que deve ser adicionado transparente:
fonte
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
fonte
Defina a navegação
modalPresentationStyle
comoUIModalPresentationCustom
e defina a cor de fundo do controlador de exibição apresentado como cor clara.
fonte