Панель навигации показать / скрыть


158

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

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

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

Ответы:


381

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

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

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

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

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

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

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

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

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

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

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

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

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

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

navigationController?.setNavigationBarHidden(true, animated: true)

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

navigationController?.setNavigationBarHidden(false, animated: true)

Если это для приложения просмотра фотографий, скрытие навигационной панели вызывает неприятный скачок для просмотра изображений, который я не нашел, как предотвратить. 3.2 позволяет использовать UIGestureRecognizer для двойных нажатий, что намного удобнее (только для iPad).
Пол Линч

Большое спасибо, Алекс, ты предоставил мне много информации, я буду следовать твоим руководствам ... спасибо большое
Shishir.bobby

это то же самое относится к панели вкладок ??? если я хочу скрыть / показать панель вкладок Дэн Ват, что я должен делать? С уважением Shishir
Shishir.bobby

1
Есть ли способ предотвратить этот «прыжок», о котором говорил Пол? У меня та же самая проблема, и я не знаю, что ее вызывает .... и я не думаю, что никто никогда не сталкивался с ней.
Ики

Чтобы остановить «прыжок», вы должны сбросить свойство contentInset представления прокрутки, как упоминает jclee, после скрытия / показа панели навигации. то есть. self.scrollView.contentInset = UIEdgeInsetsZero
crafterm

17

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

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

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

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


1
Большое спасибо за примечание contentOffset и contentInset. Вы настоящий герой.
Altealice

Я согласен, ты настоящий герой, здесь! Большое спасибо.
Gaetan

9

В Swift попробуйте это,

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

или

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

7

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

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

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

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

В iOS 7 функция автозаполнения фактически продвигает это решение, а не решение с наибольшим количеством голосов.
Алекс Заватоне

7

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

self.navigationController.hidesBarsOnTap = YES;

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

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

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


5

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

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


2

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

2

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

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


-4

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

1
Я считаю, что это плохое решение, добавление жеста касания может, если не настроено правильно, удалить жесты на других представлениях, таких как UITableView или UICollectionView. Кроме того, проверка, является ли логическое значение == true избыточным и может заставить других программистов думать, что это хорошая практика. Вы также неправильно используете верблюжий чехол и пропускаете конечную скобку в своем примере. Имейте ввиду, что селекторы swift 2.2 также были обновлены. Наконец, Swift поддерживается только на iOS 7 и выше и определенно не будет работать на iOS 3.2
Дэвид Рис
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.