Desativar a dispensa interativa do controlador de exibição apresentado no iOS 13

135

O iOS 13 apresenta um novo design modalPresentationStyle .pageSheet(e seu irmão .formSheet) para os controladores de exibição apresentados de forma modal…

A nova apresentação modal deslizante no iOS 13

... e podemos descartar essas folhas deslizando o controlador de exibição apresentado para baixo (dispensação interativa) . Embora o novo recurso "puxar para demitir" seja bastante útil, nem sempre é desejável.

A PERGUNTA: Como podemos desativar a dispensa interativa? - Lembre-se de manter o mesmo estilo de apresentação.

Jakub Truhlář
fonte
4
Possível duplicado da Apresentando modal no iOS 13 fullscreen
Mehul Thakkar
6
@MehulThakkar Essa é uma pergunta diferente.
Jakub Truhlář 11/06/19

Respostas:

240

Opção 1:

viewController.isModalInPresentation = true

Desativação de dispensa interativa

(A .pageSheetdispensação interativa desativada age assim).

  • Desde o iOS 13, UIViewControllercontém uma nova propriedade chamada isModalInPresentationque deve ser configurada truepara impedir a dispensa interativa.
  • Ele basicamente ignora eventos fora dos limites do controlador de exibição. Tenha isso em mente se você estiver usando não apenas o estilo automático, mas também estilos de apresentação como .popoveretc.
  • Esta propriedade é falsepor padrão.

Dos documentos oficiais : Se true, o UIKit ignora eventos fora dos limites do controlador de exibição e impede a dispensa interativa do controlador de exibição enquanto estiver na tela.


Opção 2:

func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
    return false
}
  • Desde o iOS 13, UIAdaptivePresentationControllerDelegatecontém um novo método chamado presentationControllerShouldDismiss.
  • Este método é chamado somente se o controlador de vista apresentado não é rejeitado por meio de programação e sua isModalInPresentationpropriedade é definida como false.

Dica: Não se esqueça de atribuir o delegado do PresentationController.

Jakub Truhlář
fonte
2
Se o controlador de exibição apresentado for um controlador de navegação, você poderá definir isModalInPresentationno controlador de navegação ou nos controladores de exibição individuais mostrados na pilha de navegação. O último permite que você escolha, tela por tela, se a demissão interativa é possível. Cuidado com os controladores de pesquisa, eles têm precedência sobre o controlador de exibição individual (mas não o controlador de navegação). Mais informações no meu blog: medium.com/@hacknicity/...
Geoff Hackworth
1
Tenha em mente que se o seu VC é apresentado como um popover, isso vai impedir o popover de ser demitido quando tocar fora dela
PatrickDotStar
4
Objective-C:viewController.modalInPresentation = YES;
quarac 01/10/19
3
Alguém conseguiu fazer isso funcionar ao definir esse sinalizador em um UIImagePickerController? Para nós, parece que o UIImagePickerControllerestá ignorando e pode ser descartado com o gesto de deslizar. Talvez seja um bug do iOS 13.
PatrickDotStar
4
Quando presentationControllerShouldDismiss(_ presentationController: UIPresentationController)retorna false, presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController)é chamado para que você possa fazer coisas como adicionar um diálogo de confirmação se o usuário tiver inserido dados.
Neil
66
  1. Se você deseja o mesmo comportamento da versão anterior do iOS (<iOS13), como a apresentação do modelo em tela cheia, basta definir o estilo de apresentação do seu controlador de exibição de destino como UIModalPresentationStyle.fullScreen

    let someViewController = \*VIEW CONTROLLER*\
    someViewController.modalPresentationStyle = .fullScreen
    

    E se você estiver usando o storyboard, selecione a seguinte e selecione Full Screena Presentationlista suspensa.

    insira a descrição da imagem aqui

  2. Se você quiser apenas desativar a demissão interativo e manter o novo conjunto estilo de apresentação UIViewControllerpropriedade isModalInPresentationpara true.

    if #available(iOS 13.0, *) {
        someViewController.isModalInPresentation = true // available in IOS13
    }
    
Bilal
fonte
Funciona melhor do que usar {controller.isModalInPresentation = true}.
Maxim Firsoff 15/01
8

A propriedade isModalInPresentationpode ajudar.

A partir da documentação:

Quando você o define true, o UIKit ignora eventos fora dos limites do controlador de exibição e impede a dispensa interativa do mesmo enquanto estiver na tela.

Você pode usá-lo assim:

let controller = MyViewController()
controller.isModalInPresentation = true
self.present(controller, animated: true, completion: nil)
Mohit Tomar
fonte
5

Se você estiver usando storyboards para planejar sua interface do usuário, encontrei a melhor maneira de desativar essa dispensa interativa ao usar um controlador de navegação: alterar a apresentação do controlador de navegação no inspetor de atributos, de automático para tela cheia. Todos os controladores de exibição em sua pilha de navegação serão exibidos em tela cheia e não poderão ser descartados pelo usuário.

Inspetor de atributos mostrando a opção de apresentação para o controlador de navegação

Brandon Whitton
fonte
1

A Apple compartilhou um código de amostra sobre ele neste link

Ele usa a isModalInPresentationsugestão de muitos usuários.

Arda Oğul Üçpınar
fonte