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.