Disabilita l'eliminazione interattiva del controller di visualizzazione presentato in iOS 13


135

iOS 13 introduce un nuovo design di modalPresentationStyle .pageSheet(e del suo fratello .formSheet) per i controller di visualizzazione presentati in modo modale ...

La nuova presentazione modale scorrevole in iOS 13

... e possiamo chiudere questi fogli facendo scorrere verso il basso il controller della vista presentato (chiusura interattiva) . Sebbene la nuova funzionalità "pull-to-licenziare" sia piuttosto utile, potrebbe non essere sempre desiderabile.

LA DOMANDA: Come possiamo disattivare il licenziamento interattivo? - Tieni presente che manteniamo lo stesso stile di presentazione.



6
@MehulThakkar Questa è una domanda diversa.
Jakub Truhlář

Risposte:


240

Opzione 1:

viewController.isModalInPresentation = true

Licenziamento interattivo disabilitato

(Il .pageSheetlicenziamento interattivo disabilitato si comporta in questo modo.)

  • Poiché iOS 13, UIViewControllercontiene una nuova proprietà chiamata isModalInPresentationche deve essere impostata su trueper impedire il licenziamento interattivo.
  • Fondamentalmente ignora gli eventi al di fuori dei limiti del controller di visualizzazione. Tienilo a mente se stai usando non solo lo stile automatico ma anche stili di presentazione come .popoverecc.
  • Questa proprietà è falsepredefinita.

Dai documenti ufficiali : If true, UIKit ignora gli eventi al di fuori dei limiti del controller di visualizzazione e impedisce la chiusura interattiva del controller di visualizzazione mentre è sullo schermo.


Opzione 2:

func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
    return false
}
  • Poiché iOS 13, UIAdaptivePresentationControllerDelegatecontiene un nuovo metodo chiamato presentationControllerShouldDismiss.
  • Questo metodo viene chiamato solo se il controller di visualizzazione presentato non viene eliminato a livello di codice e la sua isModalInPresentationproprietà è impostata su false.

Suggerimento: non dimenticare di assegnare il delegato di presentationController.


2
Se il controller di visualizzazione presentato è un controller di navigazione, è possibile impostarlo isModalInPresentationsul controller di navigazione o sui singoli controller di visualizzazione mostrati nello stack di navigazione. Quest'ultimo consente di scegliere schermo per schermo se il licenziamento interattivo è possibile. Attenti ai controller di ricerca, hanno la precedenza sul controller di visualizzazione individuale (ma non sul controller di navigazione). Maggiori informazioni nel mio post sul blog: medium.com/@hacknicity/…
Geoff Hackworth,

1
Tieni presente che se il tuo VC viene presentato come un popover, ciò impedirà che il popover venga ignorato quando si
tocca

4
Obiettivo-C:viewController.modalInPresentation = YES;
quarac

3
Qualcuno lo ha fatto funzionare quando si imposta questo flag su un UIImagePickerController? Per noi sembra che lo UIImagePickerControllerstia ignorando e quindi può essere ignorato con il gesto di scorrimento. Forse è un bug di iOS 13.
PatrickDotStar

4
Quando presentationControllerShouldDismiss(_ presentationController: UIPresentationController)restituisce false, presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController)viene chiamato in modo da poter fare cose come aggiungere una finestra di dialogo di conferma se l'utente ha inserito dei dati.
Neil

66
  1. Se desideri lo stesso comportamento della versione iOS precedente (<iOS13) come la presentazione del modello a schermo intero, imposta lo stile di presentazione del controller della vista di destinazione su UIModalPresentationStyle.fullScreen

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

    E se stai usando lo storyboard, seleziona il segua e seleziona Full Screendal Presentationmenu a discesa.

    inserisci qui la descrizione dell'immagine

  2. Se desideri semplicemente disabilitare l'eliminazione interattiva e mantenere la nuova UIViewControllerproprietà di impostazione dello stile di presentazione isModalInPresentationsu true.

    if #available(iOS 13.0, *) {
        someViewController.isModalInPresentation = true // available in IOS13
    }

Funziona meglio rispetto all'utilizzo di {controller.isModalInPresentation = true}.
Maxim Firsoff

8

La proprietà isModalInPresentation potrebbe aiutare.

Dalla documentazione:

Quando lo imposti true, UIKit ignora gli eventi al di fuori dei limiti del controller di visualizzazione e impedisce l'eliminazione interattiva del controller di visualizzazione mentre è sullo schermo.

Puoi usarlo in questo modo:

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

5

Se stai utilizzando gli storyboard per impaginare la tua interfaccia utente, ho trovato il modo migliore per disabilitare questo licenziamento interattivo quando si utilizza un controller di navigazione è cambiare la presentazione del controller di navigazione nell'ispettore attributi da Automatico a Schermo intero. Tutti i controller di visualizzazione nel tuo stack di navigazione saranno quindi a schermo intero e non potranno essere eliminati dall'utente.

Attribute Inspector che mostra l'opzione di presentazione per il controller di navigazione


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.