Nova apresentação modal do iOS 13: o controlador de apresentação não se move para baixo

11

Eu tenho um comportamento estranho ao apresentar o UIViewControllers modalmente no iOS 13. O novo estilo de apresentação que eu já vi no iOS 13 se parece com o seguinte:

O controlador de exibição apresentado aparece atrás do controlador de exibição apresentado. Também é deslocado para imitar uma "pilha"

O controlador de exibição apresentado aparece atrás do controlador de exibição apresentado.  Também é deslocado para imitar uma "pilha"

Enquanto isso, ao apresentar controladores de exibição por meio do meu aplicativo, continuo obtendo este efeito:

O controlador de exibição de apresentação não se move ao apresentar um novo controlador de exibição

O controlador de exibição de apresentação não se move ao apresentar um novo controlador de exibição

Eu uso esse código para apresentar este controlador de exibição:

let controller = storyboard?.instantiateViewController(withIdentifier: "tutorial") as! TutorialController
controller.modalPresentationStyle = .pageSheet
controller.modalTransitionStyle = .coverVertical
present(controller, animated: true, completion: nil)

Aqui está minha pergunta: estou me perguntando por que isso está acontecendo e se há uma maneira de apresentar os controladores de exibição no estilo normal do iOS 13 (com o controlador de exibição em exibição voltando).

Desde já, obrigado!

CentrumGuy
fonte
Como teste, tente comentar o controller.modalTransitionStyle = .coverVerticale até o controller.modalPresentationStyle = .pageSheet(embora o estilo de apresentação seja necessário se esse código também for executado em um iPad).
Rdddy
Eu comentei, mas não muda nada :(
CentrumGuy 7/07

Respostas:

3

Acontece que o problema era minha hierarquia de controladores de exibição. Consegui corrigi-lo, tornando o controlador de exibição de apresentação o controlador de exibição raiz do meu aplicativo. Primeiro, defino o controlador de segundo plano como o controlador de visualização raiz chamando

window.rootViewController = self

e depois usando meu código anterior

let controller = storyboard?.instantiateViewController(withIdentifier: "tutorial") as! TutorialController
controller.modalPresentationStyle = .pageSheet
controller.modalTransitionStyle = .coverVertical
present(controller, animated: true, completion: nil)

Eu apresentei o controlador de exibição. Obrigado a todos que tentaram ajudar!

CentrumGuy
fonte
Eu estou tendo o mesmo problema. Onde você definiu o sinalizador rootViewController? Logo antes do segue?
Paweł Zgoda-Ferchmin 22/10/19
Eu o configurei quando apresentei o "controlador de plano de fundo". Vamos chamá-los de controladores 1, 2 e 3 para facilitar as coisas (sendo 1 o mais distante atrás, 2 o fundo atrás de 3 e 3 o da frente, também conhecido como Tutorial do Controlador). Atualmente, estamos olhando para o controlador 1. Em vez de chamar present () no controlador 1 para apresentar o controlador 2, apenas defino o controlador 2 como o controlador de visualização raiz. Isso basicamente se livra do controlador 1 e nossa janela agora só possui o controlador 2 em sua hierarquia. Agora, você pode apresentar controlador 3 normalmente chamando presente () no controlador 2.
CentrumGuy
Claro, isso funciona para mim, mas causa uma variedade de problemas diferentes, como desaparecer a barra de status ou o corte de animação durante segue, também não acho que seja seguro. Tem que haver uma solução melhor para isso ...
Paweł Zgoda-Ferchmin
Quando esses problemas ocorrem? Quando você chama o presente () ou quando define o controlador de visualização raiz? A barra de status que desaparece pode ser porque a barra de status está em texto preto e aparece em um plano de fundo preto quando o presente () ocorre, fazendo com que ele se misture ao plano de fundo do aplicativo.
CentrumGuy
11
Eu criei um projeto de demonstração simples. Você pode ver aqui: github . Toda a lógica está no Controller1.swift. Avise-me se isso ajudar!
CentrumGuy
1

Acho que o problema pode ser resolvido usando vc.modalPresentationStyle = .fullScreense não houver UINavigationController, caso contrário, você pode usar esses códigos da seguinte maneira:

let navigationController = UINavigationController(rootViewController: vc) 
navigationController.modalPresentationStyle = .fullScreen 
present(vc, animated: true)

porque, com o iOS 13, esse é um novo recurso que a Apple alterou o estilo de apresentação padrão dos View Controllers para uma folha modal da tela cheia no iOS 12

Apple mudou o padrão
fonte
2
O .fullScreen faz com que pareça a antiga apresentação do iOS 12, na qual você não consegue ver o controlador por trás disso. Não é para isso que estou buscando.
CentrumGuy
@CentrumGuy, você pode ver o link " medium.com/better-programming/… ", explicado em detalhes.
Apple alterou o padrão
11
Sei que a Apple mudou o estilo de apresentação padrão no iOS 13. No entanto, quando apresento meus controladores de exibição no meu aplicativo, o controlador de apresentação não se move como em qualquer outro lugar no iOS 13. Você pode observar a diferença entre o primeiro e o segundo imagens da maneira como o controlador de exibição apresentado é exibido atrás do controlador de exibição superior. Eu quero pegar o meu para mostrar como a primeira imagem
CentrumGuy
Estou feliz por poder ajudar!
glotcha
1

Programaticamente:

let vc = UIViewController()
vc.modalPresentationStyle = .fullScreen //or .overFullScreen for transparency
self.present(vc, animated: true, completion: nil)

Do storyboard:

insira a descrição da imagem aqui

É isso aí. Não há necessidade de jogar com o controlador raiz ou a janela.

Para referência, visite este artigo .

iBug
fonte
0

Podemos alterá-lo na barra de ferramentas do Inspector. Para alcançá-lo: vá para a quinta seção do Inspector Tollbar e altere o campo Presentation para Full Screen.

Navin Dogiparthi
fonte
-1

Essa deve ser a única propriedade que você precisa definir

presentedViewController.modalPresentationStyle = .automatic

Detalhado em https://developer.apple.com/videos/play/wwdc2019/224/

glotcha
fonte
Defini-la como automática não aparecer para resolver este problema
CentrumGuy
O controlador de visão atrás do controlador de visão de primeiro plano é o que eu chamo de "presente". (O que você pode tipo de ver por trás do controlador)
CentrumGuy
é a raiz? você pode verificar window.rootViewController
glotcha