Di iOS 7 Apple menambahkan perilaku navigasi default baru. Anda dapat menggesek dari tepi kiri layar untuk kembali ke tumpukan navigasi. Namun di aplikasi saya, perilaku ini bertentangan dengan menu kiri khusus saya. Jadi, apakah mungkin untuk menonaktifkan gerakan baru ini di UINavigationController?
326
navigationItem.hidesBackButton = true
, gerakan ini juga dinonaktifkan. Dalam kasus saya, saya menerapkan tombol kembali kustom dan menambahkan sebagaileftBarButtonItem
Jawaban:
Saya menemukan solusinya:
Tujuan-C:
Swift 3+:
self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
sumber
enable / disable
mengenali diviewDidAppear:
/viewDidDisappear
. Atau, Anda dapat mengimplementasikanUIGestureRecognizerDelegate
protokol dengan logika yang lebih kompleks dan menjadikannya sebagairecognizer.delegate
properti.self.navigationController.interactivePopGestureRecognizer.enabled
properti tidak bekerja dalam mengikuti metode pandangan ini:viewDidLoad
,viewWillAppear
,viewDidAppear
,viewDidDisappear
, tetapi karya-karya dalam metodeviewWillDisappear
. Di iOS7 ia bekerja di semua metode yang disebutkan di atas. Jadi cobalah untuk menggunakannya dalam metode lain saat bekerja pada viewController, saya mengkonfirmasi itu berfungsi untuk saya di iOS8 ketika saya mengklik beberapa tombol di dalam tampilan.Saya menemukan bahwa pengaturan gestur menjadi dinonaktifkan hanya tidak selalu berhasil. Itu memang berhasil, tetapi bagi saya itu hanya terjadi setelah saya pernah menggunakan backgesture. Kedua kalinya itu tidak akan memicu backgesture.
Perbaiki untuk saya adalah mendelegasikan gerakan dan menerapkan metode shouldbegin untuk mengembalikan TIDAK:
sumber
viewWillAppear
disebut pada tampilan belakang tampilan saat. Ini dapat menyebabkan kekacauan dalam logika kode karena tampilan saat ini masih aktif. Mungkin menjadi penyebab kecelakaan Anda.enabled
ya / tidak diperlukan? Anda kembaliNO
darigestureRecognizerShouldBegin
, bukankah itu cukup?Hapus saja pengenal gesture dari NavigationController. Bekerja di iOS 8.
sumber
[self.navigationController.view addGestureRecognizer:self.navigationController.interactivePopGestureRecognizer]
suatu tempat.Pada iOS 8 jawaban yang diterima tidak lagi berfungsi. Saya perlu menghentikan swipping untuk mengabaikan gerakan di layar game utama saya jadi terapkan ini:
sumber
Saya sudah sedikit memperbaiki jawaban Twan, karena:
nil
mengarah ke masalah menggantung ketika Anda kembali ke pengontrol tampilan root dan melakukan gerakan gesek sebelum menavigasi di tempat lain.Contoh berikut mengasumsikan iOS 7:
sumber
Silakan set ini di root vc:
sumber
Untuk Swift:
sumber
itu bekerja untuk saya di ios 10 dan yang lebih baru:
itu tidak bekerja pada metode viewDidLoad ().
sumber
EDIT
Jika Anda ingin mengelola fitur swipe back untuk pengontrol navigasi tertentu, pertimbangkan untuk menggunakan SwipeBack .
Dengan ini, Anda dapat mengatur
navigationController.swipeBackEnabled = NO
.Sebagai contoh:
Itu dapat diinstal melalui CocoaPods .
Saya mohon maaf karena tidak ada penjelasan.
sumber
self.navigationController.swipeBackEnabled = NO
saya yakin ini hanya akan menonaktifkan Anda gerakan kembali perpustakaan menggesek tetapi sistem masih akan diaktifkan.Metode saya Satu pengenal isyarat untuk mengatur semuanya:
Penting: jangan mengatur ulang delegasi di mana pun di tumpukan navigasi:
navigationController!.interactivePopGestureRecognizer!.delegate = nil
sumber
Ini adalah cara Swift 3
bekerja untukku
sumber
Semua solusi ini memanipulasi pengenal gerakan Apple dengan cara yang tidak mereka rekomendasikan. Saya baru saja diberitahu oleh seorang teman bahwa ada solusi yang lebih baik:
di mana myPanGestureRecognizer adalah pengenal isyarat yang Anda gunakan untuk misalnya memperlihatkan menu Anda. Dengan begitu, pengenal isyarat Apple tidak bisa dihidupkan kembali oleh mereka ketika Anda mendorong pengontrol navigasi baru dan Anda tidak perlu bergantung pada penundaan hacky yang mungkin menyala terlalu awal jika ponsel Anda tertidur atau di bawah beban berat.
Meninggalkan ini di sini karena saya tahu saya tidak akan mengingat ini saat berikutnya saya membutuhkannya, dan kemudian saya akan memiliki solusi untuk masalah ini di sini.
sumber
swift 5, swift 4.2 dapat menggunakan kode di bawah ini.
sumber
Tidak satu pun dari jawaban yang diberikan membantu saya untuk menyelesaikan masalah. Posting jawaban saya di sini; semoga bermanfaat bagi seseorang
Deklarasikan
private var popGesture: UIGestureRecognizer?
sebagai variabel global dalam viewcontroller Anda. Kemudian implementasikan kode dalam metode viewDidAppear dan viewWillDisappearIni akan menonaktifkan gesek kembali di iOS v8.x dan seterusnya
sumber
interactivePopGestureRecognizer.delegate
.if( .. respondsToSelector ..
. Baris berikutnya mengatur popGesture ke sebuah pengenal, atau ke nol. Kemudian gunakan nilainya:if (self.popGesture != nil) self.navigationController .. removeGestureRecognizer( self.popGesture )
.Ini berfungsi
viewDidLoad:
untuk iOS 8:Banyak masalah bisa diselesaikan dengan bantuan kebaikan
dispatch_after
.Meskipun harap dicatat bahwa solusi ini berpotensi tidak aman, harap gunakan alasan Anda sendiri.
Memperbarui
Untuk iOS 8.1 waktu tunda harus 0,5 detik
Di iOS 9.3 tidak ada penundaan yang diperlukan lagi, ini berfungsi hanya dengan menempatkan ini di
viewDidLoad
:(TBD jika bekerja di iOS 9.0-9.3)
sumber
viewDidLoad
ditambah penundaan adalah praktik pemrograman yang berisiko. Kebiasaan buruk untuk memulai. Bagaimana jika pengguna memulai swipe sebelum panggilan Anda yang tertunda masuk? Tidak ada waktu aman yang dijamin cukup lama namun tidak terlalu lama. Itulah sebabnya jawaban lain, yang diposting jauh sebelum Anda, menyarankan untuk memasukkan kodeviewDidAppear
. Itu memastikan semuanya terpasang. Jangan menciptakan penundaan yang sewenang-wenang; gunakan urutan panggilan Apple sebagaimana dimaksud.Untuk Swift 4 ini berfungsi:
sumber
Itu bekerja untuk saya untuk sebagian besar viewcontrollers.
Itu tidak berfungsi untuk beberapa viewcontrollers seperti UIPageViewController. Pada pagecontentviewcontroller UIPageViewController kode di bawah ini bekerja untuk saya.
Pada UIGestureRecognizerDelegate,
sumber