Nonaktifkan penutupan interaktif pengontrol tampilan yang disajikan di iOS 13


135

iOS 13 memperkenalkan desain baru modalPresentationStyle .pageSheet(dan saudara kandungnya .formSheet) untuk pengontrol tampilan yang disajikan secara sederhana…

Presentasi modal geser baru di iOS 13

… Dan kita dapat mengabaikan lembaran ini dengan menggeser pengontrol tampilan yang disajikan ke bawah (penghentian interaktif) . Meskipun fitur baru "tarik-untuk-tutup" cukup berguna, fitur ini mungkin tidak selalu diinginkan.

PERTANYAAN: Bagaimana kita bisa mematikan penghentian interaktif? - Ingatlah bahwa kami menjaga gaya presentasi tetap sama.



6
@MehulThakkar Itu pertanyaan yang berbeda.
Jakub Truhlář

Jawaban:


240

Pilihan 1:

viewController.isModalInPresentation = true

Penonaktifan interaktif dinonaktifkan

( .pageSheetTindakan penutupan interaktif yang dinonaktifkan seperti ini.)

  • Sejak iOS 13, UIViewControllerberisi properti baru yang disebut isModalInPresentationyang harus diatur trueuntuk mencegah penutupan interaktif.
  • Ini pada dasarnya mengabaikan acara di luar batas pengontrol tampilan. Ingatlah itu jika Anda tidak hanya menggunakan gaya otomatis tetapi juga gaya presentasi seperti .popoverdll.
  • Properti ini falsesecara default.

Dari dokumen resmi : Jika true, UIKit mengabaikan kejadian di luar batas pengontrol tampilan dan mencegah penutupan interaktif pengontrol tampilan saat berada di layar.


Pilihan 2:

func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
    return false
}
  • Sejak iOS 13, UIAdaptivePresentationControllerDelegateberisi metode baru yang disebut presentationControllerShouldDismiss.
  • Metode ini dipanggil hanya jika pengontrol tampilan yang disajikan tidak ditutup secara terprogram dan isModalInPresentationpropertinya disetel ke false.

Tip: Jangan lupa untuk menetapkan delegasi presentasiController.


2
Jika pengontrol tampilan yang disajikan adalah pengontrol navigasi, Anda dapat mengatur isModalInPresentationpada pengontrol navigasi atau pada pengontrol tampilan individual yang ditunjukkan di tumpukan navigasi. Yang terakhir memungkinkan Anda untuk memilih pada layar demi layar apakah pemecatan interaktif dimungkinkan. Hati-hati dengan pengontrol pencarian, mereka lebih diutamakan daripada pengontrol tampilan individu (tetapi bukan pengontrol navigasi). Info lebih lanjut di posting blog saya: medium.com/@hacknicity/…
Geoff Hackworth

1
Perlu diingat bahwa jika VC Anda ditampilkan sebagai popover, ini akan mencegah popover ditutup saat mengetuk di luarnya
PatrickDotStar

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

3
Ada yang punya ini untuk bekerja saat menyetel bendera ini pada UIImagePickerController? Bagi kami tampaknya UIImagePickerControllermengabaikannya sehingga dapat ditutup dengan gerakan menggesek. Mungkin itu adalah bug iOS 13.
PatrickDotStar

4
Ketika presentationControllerShouldDismiss(_ presentationController: UIPresentationController)mengembalikan false, presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController)dipanggil sehingga Anda dapat melakukan hal-hal seperti menambahkan dialog konfirmasi jika pengguna telah memasukkan data.
Neil

66
  1. Jika Anda menginginkan perilaku yang sama seperti di versi iOS sebelumnya (<iOS13) seperti presentasi model dalam layar penuh, cukup setel gaya presentasi pengontrol tampilan tujuan Anda ke UIModalPresentationStyle.fullScreen

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

    Dan jika Anda menggunakan storyboard, cukup pilih segua dan pilih Full Screenbentuk Presentationdropdown.

    masukkan deskripsi gambar di sini

  2. Jika Anda hanya ingin menonaktifkan penghentian interaktif dan mempertahankan UIViewControllerproperti set gaya presentasi baru isModalInPresentationke true.

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

Ini bekerja lebih baik daripada menggunakan {controller.isModalInPresentation = true}.
Maxim Firsoff

8

Properti isModalInPresentationmungkin membantu.

Dari dokumentasi:

Saat Anda menyetelnya ke true, UIKit mengabaikan kejadian di luar batas pengontrol tampilan dan mencegah penutupan interaktif pengontrol tampilan saat berada di layar.

Anda bisa menggunakannya seperti ini:

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

5

Jika Anda menggunakan storyboard untuk menata UI Anda, saya telah menemukan cara terbaik untuk menonaktifkan penghentian interaktif ini saat menggunakan pengontrol navigasi adalah dengan mengubah presentasi Pengontrol Navigasi di inspektur atribut dari Otomatis ke Layar Penuh. Semua pengontrol tampilan di tumpukan navigasi Anda kemudian akan menjadi layar penuh dan tidak akan dapat ditutup oleh pengguna.

Atribut Inspektur menampilkan opsi presentasi untuk pengontrol navigasi


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.