No iOS 13, há um novo comportamento para o controlador de exibição modal ao ser apresentado.
Agora, não está em tela cheia por padrão e, quando tento deslizar para baixo, o aplicativo simplesmente descarta o View Controller automaticamente.
Como posso evitar esse comportamento e voltar ao antigo modal em tela cheia vc?
obrigado
ios
viewcontroller
modalviewcontroller
ios13
pascalbros
fonte
fonte
fullScreen
opção deve ser o padrão para impedir a quebra de alterações na interface do usuário.isModalInPresentation
para impedir que o gesto de furto seja descartado. Ver meu blog para mais detalhes: medium.com/@hacknicity/....automatic
estilo se estabeleceu como o padrão, que é o estilo (para a maioria dos controladores de exibição).pageSheet
. No entanto, alguns controladores de exibição do sistema podem mapeá-lo para um estilo diferente.Eu adiciono uma informação que pode ser útil para alguém. Se você tiver alguma sequência de storyboard, para voltar ao estilo antigo, defina a propriedade kind como Present Modally e a propriedade Presentation em Full Screen .
fonte
performSegue
. Obrigado querida!Eu tive esse problema na visualização inicial logo após a tela de lançamento. A correção para mim, já que eu não tinha uma sequência ou lógica definida, foi mudar a apresentação de automática para tela cheia, como mostrado aqui:
fonte
Existem várias maneiras de fazer isso, e acho que cada uma pode se encaixar em um projeto, mas não em outro, então pensei em mantê-las aqui, talvez outra pessoa vá para um caso diferente.
1- Substituir presente
Se você tiver um,
BaseViewController
poderá substituir opresent(_ viewControllerToPresent: animated flag: completion:)
método.Dessa forma, você não precisa fazer nenhuma alteração em nenhuma
present
chamada, pois acabamos de substituir opresent
método.2- Uma extensão:
Uso:
3- Para um UIViewController
4- Do Storyboard
Selecione uma segue e defina a apresentação como
FullScreen
.5- Swizzling
Uso:
No seu
AppDelegate
interior,application(_ application: didFinishLaunchingWithOptions)
adicione esta linha:Dessa forma, você não precisa fazer nenhuma alteração em nenhuma chamada atual, pois estamos substituindo a implementação do método atual em tempo de execução.
Se você precisa saber o que é swizzling, pode verificar este link: https://nshipster.com/swift-objc-runtime/
fonte
Eu usei swizzling para o ios 13
então coloque isso
algum lugar
por exemplo, no AppDelegate
fonte
static let
é preguiçoso, você tem que lê-lo para deixá-lo ser calculado, var preguiçoso calculado apenas uma vez, eu usá-lo para ter garantia de que swizzling chamado uma vezPara usuários do Objective-C
Basta usar este código
Ou se você quiser adicioná-lo em particular no iOS 13.0, use
fonte
Um forro:
modalPresentationStyle
deve ser definido no navigationController que está sendo apresentado .Código testado
modalPresentationStyle requer que seja definido em navigationController .
fonte
Como dica: se você chamar de presente para um
ViewController
que está incorporado dentro de um,NavigationController
precisará definir oNavigationController
para.fullScreen
e não o VC.Você pode fazer isso como @davidbates ou programaticamente (como @pascalbros).
Um cenário de exemplo:
fonte
Eu precisava fazer as duas coisas:
Definir estilo de apresentação como Tela inteira
Definir barra superior como barra de navegação translúcida
fonte
Alterar
modalPresentationStyle
antes de apresentarfonte
Aqui está uma solução fácil sem codificar uma única linha.
Essa alteração cria o comportamento do aplicativo para iPad conforme o esperado, caso contrário, a nova tela será exibida no centro da tela como um pop-up.
fonte
Se você possui um UITabController com telas com controladores de navegação incorporados, defina a Apresentação do UITabController como FullScreen, como mostra a figura abaixo
fonte
Aqui está a solução para o Objective-C
fonte
Mais recente para iOS 13 e Swift 5.x
fonte
Aqui está minha versão da correção no ObjectiveC usando Categorias. Com essa abordagem, você terá o comportamento padrão do UIModalPresentationStyleFullScreen até que outra seja definida explicitamente.
fonte
Todas as outras respostas são suficientes, mas para um projeto grande como o nosso e onde as navegações estão sendo feitas tanto em código quanto em storyboard, é uma tarefa bastante assustadora.
Para aqueles que estão usando ativamente o Storyboard. Este é o meu conselho: use Regex.
O seguinte formato não é bom para páginas em tela cheia:
O seguinte formato é adequado para páginas em tela cheia:
O seguinte regex compatível com o VS CODE converterá todas as páginas de estilo antigo em novas páginas de estilo. Pode ser necessário escapar de caracteres especiais se você estiver usando outros mecanismos de expressão regular / editores de texto.
Pesquisar Regex
Substituir Regex
fonte
Inicialmente, o valor padrão é
fullscreen
para modalPresentationStyle, mas no iOS 13 suas alterações noUIModalPresentationStyle.automatic
.Se você deseja fazer o controlador de exibição em tela cheia, é necessário alterar
modalPresentationStyle
parafullScreen
.Consulte a
UIModalPresentationStyle
documentação da Apple para obter mais detalhes e consulte as diretrizes da interface humana da Apple para saber onde usar qual modalidade.fonte
Você pode fazer isso facilmente Abra o seu storyboard como código-fonte e procure
kind="presentation"
, em toda a tag seague com kind = presentation, adicione um atributo extramodalPresentationStyle="fullScreen"
fonte
// se você deseja desativar o furto para dispensá-lo, adicione linha
Consulte Apple Document para obter mais informações.
fonte
Consegui isso usando o método swizzling (Swift 4.2):
Para criar uma extensão UIViewController da seguinte maneira
e no AppDelegate, no aplicativo: didFinishLaunchingWithOptions: invoque o código swizzling chamando:
fonte
Isso funcionou para mim:
yourViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen
fonte
Crie uma categoria para UIViewController (por exemplo, UIViewController + PresentationStyle). Adicione o seguinte código a ele.
fonte
uma abordagem alternativa é ter seu próprio componente de base do controlador de visualização em seu aplicativo e apenas implementar os inicializadores designados e necessários com uma configuração básica, algo como o seguinte:
NOTA : Se o seu controlador de exibição estiver contido em um controlador de navegação que é realmente apresentado de forma modal, o controlador de navegação deve abordar o problema da mesma maneira (ou seja, ter seu componente personalizado do controlador de navegação personalizado da mesma maneira
Testado no Xcode 11.1 no iOS 13.1 e iOS 12.4
Espero que ajude
fonte
Eu tive esse problema com um vídeo que não apresenta mais a tela cheia. Adicionado esta linha, que salvou o dia :-)
fonte
A solução mais simples que funcionou para mim.
fonte
Se você estiver usando um UINavigationController e incorporar um ViewController como um controlador de exibição raiz, também poderá se deparar com o mesmo problema. Use o seguinte código para superar.
fonte
Em vez de chamar
self.modalPresentationStyle = .fullScreen
todos os controladores de exibição, você pode subclassificar o UIViewController e apenas usá-lo emMyViewController
qualquer lugar.fonte
As respostas e sugestões acima estão corretas, abaixo está outra versão e maneira eficiente de usar programaticamente.
# 1 criou uma extensão UIView
# 2 criou um método ()
Invocando como abaixo
OU
fonte