Gezinme çubuğu göster / gizle


158

2 çubuk düğmesinden oluşan bir gezinme çubuğuna sahip bir uygulamam var. Bir kullanıcı ekrana iki kez dokunduğunda bu gezinme çubuğunu gizlemek ve göstermek istiyorum.

Başlangıçta, gezinme çubuğu gizlenmelidir. Bir kullanıcı ekrana iki kez dokunduğunda, gezinme çubuğunun iPhone'un fotoğraf galerisinde görülebilecek gibi bir animasyon oluşturması gerekir.

Bunu nasıl yapabilirim? Öneriler her zaman takdir edilmektedir.

Yanıtlar:


381

Bu, birkaç kod satırına sığabilecek bir şey değildir, ancak bu sizin için işe yarayabilecek bir yaklaşımdır.

Gezinme çubuğunu gizlemek için:

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

Göstermek için:

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

Bu yöntemin belgelerine buradan ulaşabilirsiniz .

Bir "çift tıklamayı" dinlemek veya iki kez hafifçe vurmak UIViewiçin alt sınıfa geçin ve bu alt sınıfa bir örnek verin view.

Görünüm alt sınıfında, -touchesEnded:withEvent:yöntemini geçersiz kılın ve arka arkaya iki dokunma arasındaki süreyi, belki de ile ölçerek, kaç dokunuş elde ettiğinizi sayın CACurrentMediaTime(). Veya sonucu test edin [touch tapCount].

İki kez dokunursanız, alt sınıf görünümünüz NSNotification, görünüm denetleyicinizin dinlemek için kaydettirdiği bir sorunla karşılaşır .

Görünüm denetleyiciniz bildirimi duyduğunda, gezinme çubuğunun isHiddenözelliğini okuyarak erişilen gezinme çubuğunun geçerli görünür durumuna bağlı olarak, yukarıda belirtilen kodu kullanarak gezinme çubuğunu gizleyen veya gösteren bir seçici tetikler .

DÜZENLE

Dokunma etkinliklerini işleme cevabımın bir kısmı, iOS 3.1'den önce faydalı olabilir. UIGestureRecognizerSınıf muhtemelen çift musluklar, bugünlerde işlemek için daha iyi bir yaklaşımdır.

DÜZENLEME 2

Gezinme çubuğunu gizlemenin hızlı yolu:

navigationController?.setNavigationBarHidden(true, animated: true)

Göstermek için:

navigationController?.setNavigationBarHidden(false, animated: true)

Bu bir fotoğraf görüntüleyici uygulaması içinse, gezinme çubuğunu gizlemek, nasıl engelleneceğini bulamadığım görüntü görünümü için hoş olmayan bir sıçramaya neden olur. 3.2, daha zarif bir yaklaşım olan çift dokunuşlar için UIGestureRecognizer'ı kullanmanızı sağlar (yalnızca iPad için).
Paul Lynch

Çok teşekkürler Alex, u bana çok fazla bilgi sağladı, ben yönergeleri takip edeceğim .. teşekkürler bir ton
Shishir.bobby 28:10

Bu aynı sekme çubukları için de geçerlidir ??? sekme çubuklarını gizlemek / göstermek istersem ne yapmam gerekir? Saygılarımla shishir
Shishir.bobby

1
Pavlus'un bahsettiği bu 'zıplamayı' önlemenin bir yolu var mı? Ben de aynı sorun var ve bilmiyorum, ne neden olur .... ne sanırım, kimse üzerine tökezledi.
Icky

'Atlama' özelliğinin oluşmasını durdurmak için, gezinme çubuğunu gizledikten / gösterdikten sonra, kaydırma görüntüsünün contentInset özelliğini jclee olarak belirtmeniz gerekir. yani. self.scrollView.contentInset = UIEdgeInsetsZero
crafterm

17

Bu kod size yardımcı olacaktır.

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

Önce iOS için View Controller Programming Guide içindeki 'Navigasyon Görünümleri için Tam Ekran Düzeni Benimseme' hakkındaki bölümü ve Özel Görünümler için aynı bölümü okuyun. Photos.app gibi bir şey yapmaya çalışıyorsanız, muhtemelen bir kaydırma görünümü kullanıyorsunuzdur. Gezinme çubuklarının, gezinme çubuğunun (ve durum çubuğunun) yüksekliğini hesaba katmak için kaydırma görünümünüze otomatik olarak bir kaydırma içeriği eki eklediğine dikkat edin, böylece kaydırma görünümünüzün contentInset özelliğini hemen sıfırlamanız (UIEdgeInsetsZero) navigationBar öğesinin başlangıç ​​durumunu ve görünüm görünmeden önce ayarlama.

Ardından, navigationBar ve / veya durum çubuğunu göstermek veya gizlemek için değiştiren tek bir dokunuşunuz varsa, geçiş yönteminizde iki şey yapmanız gerekir. Bunlardan ilki, NavigationBar gizli özelliğini değiştirmeden önce kaydırma görünümünün contentOffset özelliğini kaydetmek ve kaydedilen değerinizi hemen sonra contentOffset'e geri yüklemek gibi görünüyor. NavigationBarHidden özelliğini değiştirdikten sonra ikinci olarak contentInset özelliğini UIEdgeInsetsZero olarak sıfırlayın. Ayrıca, durum çubuğunu değiştiriyorsanız, navigationBar'ın durumunu değiştirmeden önce durumunu değiştirmeniz gerekir.


1
ContentOffset ve contentInset notu için çok teşekkür ederim. Sen gerçek kahramansın.
Altealice

Aynı fikirdeyim, sen gerçek kahraman sensin! Çok teşekkürler.
Gaetan

9

In Swift , bu deneyin

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

veya

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

7

Gezinme çubuğunu gizlemek için:

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

Gezinme çubuğunu göstermek için:

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

İOS 7'de otomatik tamamlama, aslında en yüksek oyu alanın aksine bu çözümü teşvik ediyor.
Alex Zavatone

7

İşte çok hızlı ve basit bir çözüm:

self.navigationController.hidesBarsOnTap = YES;

Bu, çift dokunma yerine tek dokunuşla çalışacaktır. Ayrıca, geçerli görünüm denetleyicisini ittikten veya patlattıktan sonra bile gezinti denetleyicisinin davranışını değiştirecektir.

Bu davranışı her zaman viewWillAppear: ve viewWillDisappear: eylemleri içinde davranışınızı yalnızca tek bir görünüm denetleyicisi için ayarlamak isterseniz değiştirebilirsiniz.

İşte belgeler :


5

Bunun bir yolu, Özellik Denetçisinde "Çubuk Görünürlüğünü Göster" Gezinme Çubuğunu Göster "seçeneğinin işaretini kaldırmak olabilir.

resim açıklamasını buraya girin


2

Swift 4.2 ve Xcode 10'da

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

Gezinme çubuğunu yalnızca 1. VC'de görüntülemek istemiyorsanız, ancak 2. VC onword'lerinde görüntülemek istiyorsanız

1. VC'nize bu kodu yazın.

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

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

2

Gizli / gösterilmiş olsun, gezinme çubuğunun durumunu tespit etmek istiyorsanız. Algılamak için aşağıdaki kodu kullanabilirsiniz.

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


-4

SWIFT KODU: Bu, iOS 3.2 ve sonraki sürümler için tam olarak çalışır.

  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)

sonra yaz

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
Bunun kötü bir çözüm olduğuna inanıyorum, bir dokunma hareketi eklemek doğru yapılandırılmamışsa UITableView veya UICollectionView gibi diğer görünümlerdeki hareketleri kaldırabilir. Ayrıca bir boolean == true değerinin olup olmadığını kontrol etmek gereksizdir ve diğer programcıların bunun iyi bir uygulama olduğunu düşünmelerine yol açabilir. Ayrıca, deve durumunu kötüye kullanıyorsunuz ve örneğinizde bir uç desteğini kaçırıyorsunuz. Hızlı 2.2 seçiciler de güncellendiğinden unutmayın. Son olarak hızlıca yalnızca iOS 7 ve sonraki sürümlerde desteklenir ve kesinlikle iOS 3.2'de çalışmaz
David Rees
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.