Solusi terbaik yang saya temukan adalah dengan melakukan hal berikut pada controller tampilan pertama .
Objektif-C
- (void)viewWillAppear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:YES animated:animated];
[super viewWillAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:NO animated:animated];
[super viewWillDisappear:animated];
}
Cepat
override func viewWillAppear(animated: Bool) {
self.navigationController?.setNavigationBarHidden(true, animated: animated)
super.viewWillAppear(animated)
}
override func viewWillDisappear(animated: Bool) {
self.navigationController?.setNavigationBarHidden(false, animated: animated)
super.viewWillDisappear(animated)
}
Ini akan menyebabkan bilah navigasi untuk menghidupkan dari kiri (bersama-sama dengan tampilan berikutnya) ketika Anda mendorong berikutnya UIViewController
pada tumpukan, dan menghidupkan jauh ke kiri (bersama-sama dengan tampilan yang lama), ketika Anda menekan tombol kembali pada UINavigationBar
.
Harap perhatikan juga bahwa ini bukan metode yang didelegasikan, Anda sedang mengesampingkan UIViewController
penerapan metode ini, dan menurut dokumentasi Anda harus menghubungi implementasi super di suatu tempat dalam implementasi Anda .
animated=YES
. Saya tahu ini terlihat jelekanimated=NO
, tetapi sepertinya animasi untuk menyembunyikan navbar belum selesai, maka animasi untuk menampilkannya lagi diabaikan. Belum ada solusi.Pendekatan lain yang saya temukan adalah menetapkan delegasi untuk
NavigationController
:dan gunakan
setNavigationBarHidden
dinavigationController:willShowViewController:animated:
Cara mudah untuk menyesuaikan perilaku masing-masing
ViewController
di satu tempat.sumber
Satu perubahan kecil yang harus saya lakukan pada jawaban yang lain adalah dengan hanya menyembunyikan bilah di viewWillDisappear jika alasannya menghilang adalah karena item navigasi didorong di atasnya. Ini karena tampilan dapat menghilang karena alasan lain.
Jadi saya hanya menyembunyikan bilah jika tampilan ini bukan lagi tampilan teratas:
sumber
Saya akan meletakkan kode di delegasi viewWillAppear pada setiap tampilan yang ditampilkan:
Seperti ini di mana Anda perlu menyembunyikannya:
Seperti ini di mana Anda perlu menunjukkannya:
sumber
Jawaban yang saat ini diterima tidak sesuai dengan perilaku yang dimaksudkan yang dijelaskan dalam pertanyaan. Pertanyaannya meminta bilah navigasi disembunyikan di pengontrol tampilan root, tetapi terlihat di tempat lain, tetapi jawaban yang diterima menyembunyikan bilah navigasi pada pengontrol tampilan tertentu. Apa yang terjadi ketika instance lain dari pengontrol tampilan pertama didorong ke stack? Ini akan menyembunyikan bilah navigasi meskipun kita tidak melihat pengontrol tampilan root.
Alih-alih, strategi @Chad M. untuk menggunakan
UINavigationControllerDelegate
adalah yang baik, dan di sini adalah solusi yang lebih lengkap. Langkah:UINavigationController
-navigationController:willShowViewController:animated
metode untuk menampilkan atau menyembunyikan bilah navigasi berdasarkan apakah itu memperlihatkan pengontrol tampilan rootKode lengkap untuk solusi ini dapat ditemukan di Intisari ini . Inilah
navigationController:willShowViewController:animated
implementasinya:sumber
dalam Swift 3:
sumber
navcontroller.navagationBarHidden
akan merusak seluruh pengontrol navigasi (tidak ada gesekan bolak-balik). Untuk membuatnya bekerja, saya menggunakannavigationController?.navigationBar.hidden
sebagai gantinya. Menggesekkan masih berfungsi dan tidak meninggalkan ruang kosong karena tampaknya berada di dalam stackview atau sesuatuBerikan kredit saya untuk jawaban @ chad-m.
Ini adalah versi Swift:
MyNavigationController.swift
Perbedaan antara jawaban chad-m dan milik saya:
Mewarisi dari UINavigationController, sehingga Anda tidak akan mencemari rootViewController Anda.
gunakan
self.viewControllers.first
daripadahomeViewController
, jadi Anda tidak akan melakukan ini 100 kali untuk 100 UINavigationControllers Anda dalam 1 StoryBoard.sumber
Setelah beberapa percobaan di sini adalah bagaimana saya membuatnya bekerja untuk apa yang saya inginkan. Ini yang saya coba. - Saya memiliki pandangan dengan gambar. dan saya ingin memiliki gambar layar penuh. - Saya memiliki pengontrol navigasi dengan tabBar juga. Jadi saya perlu menyembunyikannya juga. - Juga, persyaratan utama saya bukan hanya bersembunyi, tetapi memiliki efek memudar juga saat menunjukkan dan bersembunyi.
Beginilah cara saya membuatnya bekerja.
Langkah 1 - Saya memiliki gambar dan pengguna mengetuk gambar itu sekali. Saya menangkap gerakan itu dan mendorongnya ke yang baru
imageViewController
, di dalamnyaimageViewController
, saya ingin memiliki gambar layar penuh.Langkah 2 - Semua langkah di bawah ini ada di ImageViewController
Langkah 2.1 - Di ViewDidLoad, tampilkan navBar
Langkah 2.2 - In
viewDidAppear
, atur tugas pengatur waktu dengan penundaan (Saya sudah mengaturnya untuk penundaan 1 detik). Dan setelah penundaan, tambahkan efek fading. Saya menggunakan alpha untuk menggunakan fading.langkah 2.3 - Di bawah
viewWillAppear
, tambahkan gerakan singleTap ke gambar dan membuat navBar tembus.Langkah 3 - Akhirnya
viewWillDisappear
, pastikan untuk mengembalikan semua barangsumber
Jika ada yang masih mengalami masalah dengan bug dibatalkan fast backswipe seperti @fabb berkomentar dalam jawaban yang diterima.
Saya berhasil memperbaikinya dengan mengabaikan
viewDidLayoutSubviews
, selainviewWillAppear/viewWillDisappear
seperti yang ditunjukkan di bawah ini:Dalam kasus saya, saya perhatikan bahwa itu karena pengontrol tampilan root (di mana nav disembunyikan) dan pengontrol tampilan yang didorong (nav ditampilkan) memiliki gaya bilah status yang berbeda (mis. Gelap dan terang). Saat Anda memulai backswipe untuk memunculkan controller tampilan, akan ada animasi warna status bar tambahan. Jika Anda melepaskan jari Anda untuk membatalkan pop interaktif, sementara animasi status bar belum selesai , bilah navigasi selamanya hilang!
Namun, bug ini tidak terjadi jika gaya bilah status dari kedua pengontrol tampilan sama.
sumber
Jika yang Anda inginkan adalah menyembunyikan bilah navigasi sepenuhnya di dalam pengontrol, solusi yang lebih bersih adalah, di pengontrol root, memiliki sesuatu seperti:
Saat Anda mendorong tampilan anak di controller, Bilah Navigasi akan tetap tersembunyi; jika Anda ingin menampilkannya hanya pada anak, Anda akan menambahkan kode untuk ditampilkan
it(self.navigationController.navigationBarHidden=NO;)
diviewWillAppear
callback, dan juga kode untuk menyembunyikannya diviewWillDisappear
sumber
Implementasi yang paling sederhana adalah dengan meminta setiap pengontrol tampilan menentukan apakah bilah navigasinya tersembunyi atau tidak dalam
viewWillAppear:animated:
metodenya. Pendekatan yang sama berfungsi dengan baik untuk menyembunyikan / menampilkan toolbar juga:sumber
Menyembunyikan bilah navigasi hanya pada halaman pertama dapat dicapai melalui storyboard juga. Pada storyboard, goto Navigation Controller Scene-> Navigation Bar . Dan pilih properti ' Tersembunyi ' dari inspektur Atribut . Ini akan menyembunyikan bilah navigasi mulai dari viewcontroller pertama hingga terlihat oleh viewcontroller yang diperlukan.
Bilah navigasi dapat diatur kembali agar terlihat di panggilan balik ViewWillAppear ViewController.
sumber
Swift 4:
Di pengontrol tampilan Anda ingin menyembunyikan bilah navigasi.
sumber
Dengan menerapkan kode ini di ViewController Anda, Anda bisa mendapatkan efek ini Sebenarnya triknya adalah, sembunyikan navigationBar ketika Controller itu diluncurkan
dan sembunyikan bilah navigasi ketika pengguna meninggalkan halaman itu lakukan ini viewWillDisappear
sumber