Presentasi Modal iOS 13 Baru: Pengontrol Penyajian Tidak Bergerak Turun

11

Saya memiliki perilaku aneh ketika menghadirkan UIViewControllers secara modern di iOS 13. Gaya presentasi baru yang saya lihat di seluruh iOS 13 terlihat seperti ini:

Pengontrol tampilan tampilan muncul di belakang pengontrol tampilan yang disajikan. Itu juga digeser ke bawah untuk meniru "tumpukan"

Pengontrol tampilan tampilan muncul di belakang pengontrol tampilan yang disajikan.  Itu juga digeser ke bawah untuk meniru "tumpukan"

Sementara itu, ketika menghadirkan pengontrol tampilan melalui aplikasi saya, saya terus mendapatkan efek ini:

Pengontrol tampilan tampilan tidak bergerak sama sekali saat menampilkan pengontrol tampilan baru

Pengontrol tampilan tampilan tidak bergerak sama sekali saat menampilkan pengontrol tampilan baru

Saya menggunakan kode ini untuk menyajikan pengontrol tampilan ini:

let controller = storyboard?.instantiateViewController(withIdentifier: "tutorial") as! TutorialController
controller.modalPresentationStyle = .pageSheet
controller.modalTransitionStyle = .coverVertical
present(controller, animated: true, completion: nil)

Inilah pertanyaan saya: Saya bertanya-tanya mengapa hal ini terjadi dan apakah ada cara untuk menghadirkan pengontrol tampilan dalam gaya iOS 13 normal (dengan pengontrol tampilan tampilan bergerak mundur).

Terima kasih sebelumnya!

CentrumGuy
sumber
Sebagai ujian, cobalah mengomentari controller.modalTransitionStyle = .coverVerticaldan bahkan controller.modalPresentationStyle = .pageSheet(meskipun gaya presentasi akan diperlukan jika kode ini juga dijalankan di iPad).
rmaddy
Saya berkomentar tetapi tidak mengubah apa pun :(
CentrumGuy

Jawaban:

3

Ternyata masalahnya adalah hierarki pengontrol tampilan saya. Saya dapat memperbaikinya dengan membuat tampilan pengendali tampilan pengendali tampilan root aplikasi saya. Pertama saya mengatur pengontrol latar belakang sebagai pengontrol tampilan root dengan memanggil

window.rootViewController = self

dan kemudian menggunakan kode saya sebelumnya

let controller = storyboard?.instantiateViewController(withIdentifier: "tutorial") as! TutorialController
controller.modalPresentationStyle = .pageSheet
controller.modalTransitionStyle = .coverVertical
present(controller, animated: true, completion: nil)

Saya mempresentasikan view controller. Terima kasih kepada semua orang yang mencoba membantu!

CentrumGuy
sumber
Saya mengalami masalah yang sama. Di mana Anda mengatur flag rootViewController? Tepat sebelum segue?
Paweł Zgoda-Ferchmin
Saya mengaturnya ketika saya mempresentasikan "pengontrol latar belakang". Mari kita sebut mereka pengontrol 1, 2, dan 3 untuk mempermudah segalanya (1 menjadi yang terjauh di belakang, 2 berada di latar belakang di belakang 3, dan 3 menjadi yang di depan alias Tutorial Controller). Kami sedang melihat pengontrol 1. Alih-alih memanggil present () pada pengontrol 1 untuk menghadirkan pengontrol 2, saya hanya mengatur pengontrol 2 sebagai pengontrol tampilan root. Ini pada dasarnya menghilangkan controller 1 dan jendela kita sekarang hanya memiliki controller 2 dalam hierarki-nya. Sekarang, Anda dapat menampilkan pengontrol 3 secara normal dengan memanggil present () pada pengontrol 2.
CentrumGuy
Tentu, itu bekerja untuk saya tetapi menyebabkan berbagai masalah yang berbeda seperti menghilangnya status bar atau pemotongan animasi selama segue, juga saya tidak berpikir itu aman. Harus ada solusi yang lebih baik untuk ini ...
Paweł Zgoda-Ferchmin
Kapan masalah ini terjadi? Saat Anda memanggil sekarang () atau ketika Anda mengatur pengontrol tampilan root? Bilah status yang hilang bisa jadi karena bilah status dalam teks hitam dan muncul pada latar belakang hitam ketika sekarang () terjadi menyebabkannya berbaur dengan latar belakang aplikasi.
CentrumGuy
1
Saya membuat proyek demo sederhana. Anda dapat melihatnya di sini: github . Semua logikanya ada di Controller1.swift. Beri tahu saya jika ini membantu!
CentrumGuy
1

Saya pikir masalah ini dapat diselesaikan dengan menggunakan vc.modalPresentationStyle = .fullScreenjika tidak ada UINavigationController, jika tidak Anda dapat menggunakan kode-kode ini sebagai berikut:

let navigationController = UINavigationController(rootViewController: vc) 
navigationController.modalPresentationStyle = .fullScreen 
present(vc, animated: true)

karena Dengan iOS 13 ini adalah fitur baru yang Apple telah mengubah gaya presentasi default View Controllers menjadi lembar modal dari layar penuh di iOS 12

Apple telah mengubah default
sumber
2
.fullScreen menjadikannya seperti presentasi iOS 12 lama di mana Anda tidak dapat melihat pengontrol di belakangnya sama sekali. Bukan itu tujuan saya.
CentrumGuy
@CentrumGuy, Anda dapat melihat tautan " medium.com/better-programming/… ", dijelaskan secara rinci.
Apple telah mengubah default
1
Saya tahu Apple mengubah gaya presentasi default di iOS 13. Namun, ketika saya menyajikan pengontrol tampilan di aplikasi saya, pengontrol presentasi tidak bergerak seperti di tempat lain di iOS 13. Anda dapat melihat perbedaan antara yang pertama dan yang kedua. gambar dengan cara pengontrol tampilan yang ditampilkan ditampilkan di belakang pengontrol tampilan teratas. Saya ingin foto saya ditampilkan seperti gambar pertama
CentrumGuy
Aku senang bisa membantu!
glotcha
1

Secara terprogram:

let vc = UIViewController()
vc.modalPresentationStyle = .fullScreen //or .overFullScreen for transparency
self.present(vc, animated: true, completion: nil)

Dari storyboard:

masukkan deskripsi gambar di sini

Itu dia. Tidak perlu bermain dengan root controller atau jendela sama sekali.

Untuk referensi, kunjungi artikel ini .

iBug
sumber
0

Kami dapat mengubahnya di Bilah Alat Inspektur. Untuk Mencapai itu: kepala ke bagian kelima dari Inspektur Tollbar kemudian ubah bidang Presentasi ke Layar Penuh.

Navin Dogiparthi
sumber
-1

Ini harus menjadi satu-satunya properti yang perlu Anda atur

presentedViewController.modalPresentationStyle = .automatic

Terperinci dalam https://developer.apple.com/videos/play/wwdc2019/224/

glotcha
sumber
Mengaturnya ke otomatis sepertinya tidak memperbaiki masalah ini
CentrumGuy
Pengontrol tampilan di belakang pengontrol tampilan latar depan adalah yang saya sebut "sekarang". (Yang Anda bisa melihat di belakang controller)
CentrumGuy
apakah itu akarnya? Anda dapat memeriksa window.rootViewController
glotcha