Eu tenho uma UIViewController
visão como uma subview / modal sobre outra UIViewController
view, como que a subview / modal deve ser transparente e quaisquer componentes adicionados à subview devem estar visíveis. O problema é que eu tenho é a subview mostra fundo preto em vez de ter clearColor. Estou tentando fazer UIView
como um plano de fundo claro e não preto. Alguém sabe o que há de errado com isso? Qualquer sugestão apreciada.
FirstViewController.m
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[self presentModalViewController:vc animated:NO];
SecondViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.opaque = YES;
self.view.backgroundColor = [UIColor clearColor];
}
RESOLVIDO : Corrigi os problemas. Está funcionando tão bem para iPhone e iPad. Controlador de vista modal sem fundo preto apenas clearColor / transparente. A única coisa que eu preciso para a mudança é Troquei UIModalPresentationFullScreen
a UIModalPresentationCurrentContext
. Quão simples é isso!
FirstViewController.m
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
vc.view.backgroundColor = [UIColor clearColor];
self.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentViewController:vc animated:NO completion:nil];
AVISO: Se você estiver usando uma modalPresentationStyle
propriedade de navigationController
:
FirstViewController.m
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
vc.view.backgroundColor = [UIColor clearColor];
self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentViewController:vc animated:NO completion:nil];
AVISO: A má notícia é que a solução acima não funciona no iOS 7. A boa notícia é que eu corrigi o problema no iOS7! Pedi ajuda a alguém e aqui está o que ele disse:
Ao apresentar um controlador de exibição modalmente, o iOS remove os controladores de exibição abaixo da hierarquia de visualizações pela duração em que é apresentado. Embora a visualização do seu controlador de exibição apresentado de forma modal seja transparente, não há nada abaixo dele, exceto a janela do aplicativo, que é preta. O iOS 7 introduziu um novo estilo de apresentação modal UIModalPresentationCustom
, que faz com que o iOS não remova as visualizações abaixo do controlador de visualização apresentado. No entanto, para usar esse estilo de apresentação modal, você deve fornecer seu próprio delegado de transição para lidar com a apresentação e dispensar animações. Isso está descrito na palestra 'Transições personalizadas usando controladores de exibição' da WWDC 2013 https://developer.apple.com/wwdc/videos/?id=218, que também aborda como implementar seu próprio delegado de transição.
Você pode ver minha solução para o problema acima no iOS7: https://github.com/hightech/iOS-7-Custom-ModalViewController-Transitions
fonte
modalViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;
vai resolver o problema,Respostas:
iOS8 +
No iOS8 +, agora você pode usar o novo modalPresentationStyle UIModalPresentationOverCurrentContext para apresentar um controlador de exibição com um plano de fundo transparente:
fonte
[self presentViewController:modalViewController animated:YES completion:nil];
? (em vez de targetController)?RESOLVIDO : Corrigi os problemas. Está funcionando tão bem para iPhone e iPad. Controlador de vista modal sem fundo preto apenas clearColor / transparente. A única coisa que preciso alterar é a substituição de UIModalPresentationFullScreen por UIModalPresentationCurrentContext. Quão simples é isso!
FirstViewController.m
AVISO: Se você estiver usando uma propriedade modalPresentationStyle de navigationController:
FirstViewController.m
AVISO: A má notícia é que a solução acima não funciona no iOS 7. A boa notícia é que eu corrigi o problema no iOS7! Pedi ajuda a alguém e aqui está o que ele disse:
Ao apresentar um controlador de exibição modalmente, o iOS remove os controladores de exibição abaixo da hierarquia de visualizações pela duração em que é apresentado. Embora a visualização do seu controlador de exibição apresentado de forma modal seja transparente, não há nada abaixo dele, exceto a janela do aplicativo, que é preta. O iOS 7 introduziu um novo estilo de apresentação modal, UIModalPresentationCustom, que faz com que o iOS não remova as visualizações abaixo do controlador de visualização apresentado. No entanto, para usar esse estilo de apresentação modal, você deve fornecer seu próprio delegado de transição para lidar com a apresentação e dispensar animações. Isso está descrito na palestra 'Transições personalizadas usando controladores de exibição' da WWDC 2013 https://developer.apple.com/wwdc/videos/?id=218, que também aborda como implementar seu próprio delegado de transição.
Você pode ver minha solução para o problema acima no iOS7: https://github.com/hightech/iOS-7-Custom-ModalViewController-Transitions
fonte
self.modalPresentationStyle = UIModalPresentationCurrentContext;
fez isso.self.modalPresentationStyle = UIModalPresentationFullScreen; [self performSegueWithIdentifier:@"CustomSegue" sender:self];
Portanto, para pensadores puramente visuais e fãs de storyboard, você pode:
1. Apresentando o View Controller
2. Controlador de exibição apresentado
fonte
Solução Swift 3 e iOS10:
fonte
Este é do xCode 7 beta 4 usando um arraste de controle segue. Simplesmente defina o plano de fundo do seu destino para limpar e defina as propriedades de segue no IB como esta (Nota: a apresentação também pode ser "Em tela cheia"):
fonte
Achei que a maneira mais fácil de fazê-lo funcionar no iOS7 e iOS8 é adicionar set the presentationStyle a UIModalPresentationOverCurrentContext no modallyPresentedVC (ViewController que você deseja apresentar modalmente) por causa do iOS8:
e UIModalPresentationCurrentContext na apresentação de CV (o controlador que apresenta o modallyPresented) devido ao iOS7:
Porque as coisas são tratadas de maneira diferente no iOS7 e iOS8. É claro que você não precisa definir as propriedades navigationController se não estiver usando uma. Espero que ajude.
fonte
Versão Swift2:
fonte
Outra maneira (não há necessidade de criar transição personalizada e funciona no iOS 7)
Usando o Storyboard:
Crie o Child View Controller com tamanho de liberdade, defina a largura da visualização como 500x500 (por exemplo) e adicione o próximo método:
Em seguida, crie um Modal segue com Form Sheet e teste-o.
fonte
Solução iOS 7 com segue personalizado:
Solução baseada em código de alta tecnologia.
fonte
Para mim, isso funciona:
MMPushNotificationViewController
é o controlador do Transparent View e também fiz aMMPushNotificationViewController
cor do modo de exibição como clearcolor. Agora, tudo o que eu fiz e fiz meu controlador Transparentview.fonte
Para iOS7
Agora existe uma maneira de conseguir isso usando as transições personalizadas do iOS7, da seguinte maneira:
Para criar sua transição personalizada, você precisa de duas coisas:
<UIViewControllerTransitionDelegate>
)<UIViewControllerAnimatedTransitioning>
)Você pode encontrar mais informações sobre transições personalizadas neste tutorial .
fonte
Funciona muito bem no iOS7 e iOS8
fonte
Você também pode 'adicionar novamente' a janela à exibição.
E dessa maneira, a apresentação pode ser animada.
fonte
Para o iOS 7 e apenas usando o Interface Builder, isso pode ser feito configurando a Apresentação como "Over Current Context" em todos os controladores de exibição envolvidos na apresentação modal. Mesmo para controladores de navegação.
Por exemplo, defina-o em todos esses controladores de exibição:
NavController -> RootViewController -> ModalViewController
fonte
Eu não brinquei muito com o construtor Storyboard / Interface, mas o que me impressiona é que você está dizendo que a vista tem uma cor clara (ou seja, 100% alfa / transparente) e também está dizendo que ela é opaca ( 0% alfa - completamente sólido). Essas duas coisas não parecem se encaixar. Gostaria de comentar a
self.view.opaque = YES;
linha e ver se funciona;)Ah, outra coisa que eu pensei - é perfeitamente possível que o seu controlador de exibição tenha o fundo alfa, mas é claro que o alfa estará mostrando a cor da janela base ou do controlador de visualização raiz do programa, que é por preto padrão. A camada básica de todo o aplicativo não pode ter um plano de fundo transparente - transparente para quê? O que há por trás disso? Tem que haver algo para ver através da transparência. Isso faz sentido?
fonte
Basta usar "self.modalPresentationStyle = UIModalPresentationCurrentContext;", na exibição de apresentação
Vai funcionar bem :)
fonte