Панель навигации показать / скрыть - PullRequest
151 голосов
/ 28 мая 2010

У меня есть приложение с панелью навигации, состоящей из 2 кнопок панели. Я хотел бы скрыть и показать эту панель навигации, когда пользователь дважды касается экрана.

Изначально панель навигации должна быть скрыта. Когда пользователь дважды нажимает на экран, на панели навигации должна появиться анимация, как в фотогалерее iPhone.

Как мне это сделать? Предложения всегда приветствуются.

Ответы [ 10 ]

366 голосов
/ 28 мая 2010

Это не то, что может вписаться в несколько строк кода, но это один подход, который может работать для вас.

Чтобы скрыть панель навигации:

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

Чтобы показать это:

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

Документация для этого метода доступна здесь .

Чтобы прослушать «двойной щелчок» или двойное касание, создайте подкласс UIView и создайте экземпляр этого подкласса для свойства view контроллера представления.

В подклассе представления переопределите его метод -touchesEnded:withEvent: и посчитайте, сколько касаний вы получили за определенный промежуток времени, измеряя время между двумя последовательными касаниями, возможно, с помощью CACurrentMediaTime() . Или проверьте результат из [touch tapCount].

Если вы получили два касания, ваш подклассический вид выдает NSNotification, который ваш контроллер вида зарегистрировал для прослушивания.

Когда ваш контроллер представления слышит уведомление, он запускает селектор, который либо скрывает, либо показывает панель навигации с использованием вышеупомянутого кода, в зависимости от текущего состояния видимой панели навигации, доступ к которому осуществляется посредством чтения * 1034 панели навигации 1035 * собственность.

EDIT

Часть моего ответа для обработки событий касания, вероятно, полезна еще до iOS 3.1. В наши дни класс UIGestureRecognizer, вероятно, является лучшим подходом для обработки двойных нажатий.

РЕДАКТИРОВАТЬ 2

Быстрый способ скрыть панель навигации:

self.navigationController?.setNavigationBarHidden(true, animated: true)

Чтобы показать это:

self.navigationController?.setNavigationBarHidden(false, animated: true)
17 голосов
/ 06 декабря 2012

Этот код поможет вам.

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 голосов
/ 12 декабря 2010

Сначала прочтите раздел в Руководстве по программированию View Controller для iOS о «Принятии полноэкранного макета для представлений навигации» и раздел о том же для пользовательских представлений. Если вы пытаетесь сделать что-то вроде Photos.app, то вы, вероятно, используете представление с прокруткой. Обратите внимание на комментарий о том, что панели навигации автоматически добавляют вставку содержимого прокрутки в представление прокрутки, чтобы учесть высоту панели навигации (и строки состояния), поэтому вам необходимо сбросить свойство contentInset представления прокрутки обратно в ноль (UIEdgeInsetsZero) сразу после установка начального состояния панели навигации и до появления представления.

Тогда, если у вас есть одно касание, которое переключает навигационную панель и / или строку состояния для отображения или скрытия, вам нужно сделать две вещи в вашем методе переключения. Первым кажется сохранить свойство contentOffset представления прокрутки перед изменением скрытого свойства NavigationBar и сразу после этого восстановить сохраненное значение в contentOffset. А затем, чтобы снова обнулить свойство contentInset до UIEdgeInsetsZero после изменения свойства navigationBarHidden. Кроме того, если вы переключаете строку состояния, вам необходимо изменить ее состояние перед изменением состояния панели навигации.

9 голосов
/ 20 мая 2015

In Swift Попробуйте,

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

или

self.navigationController?.setNavigationBarHidden(true, animated: true) //Hide
self.navigationController?.setNavigationBarHidden(false, animated: true) //SHow
7 голосов
/ 20 июня 2015

Вот очень быстрое и простое решение:

self.navigationController.hidesBarsOnTap = YES;

Это будет работать в одно касание вместо двойного касания. Также это изменит поведение для контроллера навигации даже после нажатия или выталкивания текущего контроллера представления.

Вы всегда можете изменить это поведение в вашем контроллере внутри viewWillAppear: и viewWillDisappear: действия, если вы хотите установить поведение только для одного контроллера представления.

Вот документация :

7 голосов
/ 05 августа 2013

Чтобы скрыть панель навигации:

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

Показать панель навигации:

[self.navigationController setNavigationBarHidden:NO animated:YES];
4 голосов
/ 21 ноября 2015

Одним из способов может быть снятие флажка Видимость панели «Показывает панель навигации» в Инспекторе атрибутов. Надеюсь, это кому-нибудь поможет.

enter image description here

2 голосов
/ 19 января 2019

В Swift 4.2 и Xcode 10

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

Если вы не хотите отображать панель навигации только в 1-ом ВК, но хотите, чтобы во 2-ом ВК добавили

В вашем первом VC напишите этот код.

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

override func viewWillDisappear(_ animated: Bool) {
    self.navigationController?.isNavigationBarHidden = false  //Show
}
0 голосов
/ 11 февраля 2016

hidesBarsOnTap в свойстве UINavigationController позволяют справиться только с iOS8 SDK

https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UINavigationController_Class/#//apple_ref/occ/instp/UINavigationController/hidesBarsOnTap

0 голосов
/ 08 июля 2015

SWIFT CODE: полностью работает для iOS 3.2 и новее.

  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)

затем напишите

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
    }
}
...