Навигационная панель show/hide

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

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

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

Ответ 1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ответ 2

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

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];
}
}

Ответ 3

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

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

Ответ 4

В 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

Ответ 5

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

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

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

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

Ответ 6

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

self.navigationController.hidesBarsOnTap = YES;

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

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

Вот documentation:

Ответ 7

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

введите описание изображения здесь

Ответ 8

В Swift 4.2 и Xcode 10

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

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

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

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

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

Ответ 10

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