Bilah navigasi tampilkan / sembunyikan


158

Saya memiliki aplikasi dengan bilah navigasi yang terdiri dari 2 tombol bilah. Saya ingin menyembunyikan dan menampilkan bilah navigasi ini ketika pengguna mengetuk layar dua kali.

Awalnya, bilah navigasi harus disembunyikan. Ketika pengguna mengetuk layar dua kali, bilah navigasi akan muncul dengan animasi, seperti apa yang bisa dilihat di galeri foto iPhone.

Bagaimana saya bisa melakukan ini? Saran selalu dihargai.

Jawaban:


381

Ini bukan sesuatu yang bisa masuk ke dalam beberapa baris kode, tetapi ini adalah salah satu pendekatan yang mungkin cocok untuk Anda.

Untuk menyembunyikan bilah navigasi:

[[self navigationController] setNavigationBarHidden:YES animated:YES];

Untuk menunjukkannya:

[[self navigationController] setNavigationBarHidden:NO animated:YES];

Dokumentasi untuk metode ini tersedia di sini .

Untuk mendengarkan "klik dua kali" atau ketuk dua kali, subkelas UIViewdan buat instance dari subkelas tersebut viewmilik pengontrol tampilan Anda .

Dalam tampilan subkelas, timpa -touchesEnded:withEvent:metodenya dan hitung berapa banyak sentuhan yang Anda dapatkan dalam durasi waktu, dengan mengukur waktu antara dua ketukan berturut-turut, mungkin dengan CACurrentMediaTime(). Atau uji hasilnya dari [touch tapCount].

Jika Anda mendapatkan dua ketukan, tampilan subkelas Anda mengeluarkan masalah NSNotificationyang didengarkan pengontrol tampilan Anda.

Ketika pengontrol tampilan Anda mendengar notifikasi, ia akan memancarkan pemilih yang menyembunyikan atau menampilkan bilah navigasi menggunakan kode yang disebutkan di atas, tergantung pada keadaan yang terlihat saat ini di bilah navigasi, diakses melalui membaca isHiddenproperti bilah navigasi .

EDIT

Bagian dari jawaban saya untuk menangani acara tap mungkin berguna kembali sebelum iOS 3.1. The UIGestureRecognizerkelas mungkin pendekatan yang lebih baik untuk menangani double-tap, hari ini.

EDIT 2

Cara Swift untuk menyembunyikan bilah navigasi adalah:

navigationController?.setNavigationBarHidden(true, animated: true)

Untuk menunjukkannya:

navigationController?.setNavigationBarHidden(false, animated: true)

Jika ini untuk aplikasi penampil foto, menyembunyikan bilah navigasi menyebabkan lompatan yang tidak menyenangkan untuk tampilan gambar, yang belum saya temukan cara mencegahnya. 3,2 memungkinkan Anda menggunakan UIGestureRecognizer untuk ketukan ganda, yang merupakan pendekatan yang jauh lebih rapi (hanya untuk iPad saja).
Paul Lynch

Terima kasih banyak Alex, Anda memberi saya banyak infoemation, saya akan mengikuti panduan Anda .. terima kasih banyak
Shishir.bobby

apakah ini sama berlaku untuk bilah tab ??? jika saya ingin menyembunyikan / menampilkan tab bar dan apa yang harus saya lakukan? salam shishir
Shishir.bobby

1
Apakah ada cara untuk mencegah 'lompatan' yang disebutkan Paulus ini? Saya memiliki masalah yang sama dan saya tidak tahu, apa yang menyebabkannya .... saya juga tidak berpikir, tidak ada yang pernah menemukannya.
Icky

Untuk menghentikan 'lompatan' yang terjadi, Anda harus mengatur ulang properti contentInset dari scrollview sebagai jclee, setelah menyembunyikan / menampilkan bilah navigasi. yaitu. self.scrollView.contentInset = UIEdgeInsetsZero
crafterm

17

Kode ini akan membantu Anda.

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] 
initWithTarget:self action:@selector(showHideNavbar:)];
[self.view addGestureRecognizer:tapGesture];

-(void) showHideNavbar:(id) sender 
{ 
// write code to show/hide nav bar here 
// check if the Navigation Bar is shown
if (self.navigationController.navigationBar.hidden == NO)
{
// hide the Navigation Bar
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
// if Navigation Bar is already hidden
else if (self.navigationController.navigationBar.hidden == YES)
{
// Show the Navigation Bar
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
}

16

Pertama baca bagian dalam Panduan Pemrograman Tampilan Kontroler untuk iOS tentang 'Mengadopsi Tata Letak Layar Penuh untuk Tampilan Navigasi' dan bagian tentang hal yang sama untuk Tampilan Kustom. Jika Anda mencoba melakukan sesuatu seperti Photos.app maka Anda mungkin menggunakan tampilan gulir. Perhatikan komentar bahwa bilah Navigasi secara otomatis menambahkan inset konten gulir ke tampilan gulir ke akun untuk ketinggian bilah navigasi (dan bilah status) sehingga Anda harus mengatur ulang properti contentInset dari tampilan gulir Anda kembali ke nol (UIEdgeInsetsZero) segera setelah mengatur keadaan awal navigasiBar dan sebelum tampilan muncul.

Kemudian jika Anda memiliki satu ketukan yang mengaktifkan bilah navigasi dan / atau bilah status untuk ditampilkan atau disembunyikan, Anda perlu melakukan dua hal di dalam metode toggling. Yang pertama tampaknya menyimpan properti viewOffset tampilan gulir sebelum mengubah properti tersembunyi NavigationBar dan mengembalikan nilai Anda yang disimpan ke contentOffset segera sesudahnya. Dan yang kedua lagi nolkan properti contentInset ke UIEdgeInsetsZero setelah mengubah properti navigationBarHidden. Juga, jika Anda mengaktifkan bilah status, Anda perlu mengubah statusnya sebelum Anda mengubah status navigationBar.


1
Terima kasih banyak atas catatan contentOffset dan contentInset. Anda pahlawan sejati.
Altealice

Saya setuju, Anda adalah pahlawan sejati, di sini! Terima kasih banyak.
Gaetan

9

Di Swift coba ini,

navigationController?.isNavigationBarHidden = true  //Hide
navigationController?.isNavigationBarHidden = false //Show

atau

navigationController?.setNavigationBarHidden(true, animated: true) //Hide
navigationController?.setNavigationBarHidden(false, animated: true) //Show

7

Untuk menyembunyikan bilah Navigasi:

[self.navigationController setNavigationBarHidden:YES animated:YES];

Untuk menampilkan bilah Navigasi:

[self.navigationController setNavigationBarHidden:NO animated:YES];

Di iOS 7, pelengkapan otomatis benar-benar mempromosikan solusi ini sebagai lawan dari yang tertinggi.
Alex Zavatone

7

Inilah solusi yang sangat cepat dan sederhana:

self.navigationController.hidesBarsOnTap = YES;

Ini akan bekerja pada satu ketukan alih-alih ketuk dua kali. Juga akan mengubah perilaku pengontrol navigasi bahkan setelah mendorong atau membuka pengontrol tampilan saat ini.

Anda selalu dapat mengubah perilaku ini di controller Anda dalam viewWillAppear: dan viewWillDisappear: tindakan jika Anda ingin mengatur perilaku hanya untuk controller tampilan tunggal.

Berikut dokumentasinya :


5

Salah satu caranya bisa dengan menghapus centang pada Visibilitas Bar "Shows Navigation Bar" Di Atribut Inspektur. Tolong ini membantu seseorang.

masukkan deskripsi gambar di sini


2

Di Swift 4.2 dan Xcode 10

self.navigationController?.isNavigationBarHidden = true  //Hide
self.navigationController?.isNavigationBarHidden = false  //Show

Jika Anda tidak ingin menampilkan bilah Navigasi hanya di 1 VC, tetapi Anda ingin ditampilkan di 2 VC onword's

Di VC 1 Anda, tulis kode ini.

override func viewWillAppear(_ animated: Bool) {
    self.navigationController?.isNavigationBarHidden = true  //Hide
}

override func viewWillDisappear(_ animated: Bool) {
    self.navigationController?.isNavigationBarHidden = false  //Show
}

2

Jika Anda ingin mendeteksi status bilah navigasi apakah itu tersembunyi / ditampilkan. Anda cukup menggunakan kode berikut untuk mendeteksi -

if self.navigationController?.isNavigationBarHidden{
    print("Show navigation bar")
} else {
    print("hide navigation bar")
}


-4

KODE SWIFT: Ini berfungsi sepenuhnya untuk iOS 3.2 dan yang lebih baru.

  override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    let tapGesture = UITapGestureRecognizer(target: self, action: "hideNavBarOntap")let tapGesture = UITapGestureRecognizer(target: self, action: "hideNavBarOntap")
    tapGesture.delegate = self
    self.view.addGestureRecognizer(tapGesture)

lalu menulis

func hideNavBarOntap() {
    if(self.navigationController?.navigationBar.hidden == false) {
        self.navigationController?.setNavigationBarHidden(true, animated: true) // hide nav bar is not hidden
    } else if(self.navigationController?.navigationBar.hidden == true) {
        self.navigationController?.setNavigationBarHidden(false, animated: true) // show nav bar
    }
}

1
Saya percaya ini adalah solusi yang buruk, menambahkan gerakan tap dapat jika tidak dikonfigurasi dengan benar menghapus gerakan pada tampilan lain seperti UITableView atau UICollectionView. Juga memeriksa apakah boolean == true adalah mubazir dan dapat membuat programmer lain berpikir ini adalah praktik yang baik. Anda juga menyalahgunakan kasing unta dan kehilangan kurung kurawal dalam contoh Anda. Perlu diingat karena pemilih 2.2 yang cepat telah diperbarui juga. Swift terakhir hanya didukung di iOS 7 dan di atasnya dan pasti tidak akan berjalan di iOS 3.2
David Rees
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.