Панель навигации показать / скрыть
У меня есть приложение с панелью навигации, состоящей из 2 кнопок панели. Я хотел бы скрыть и показать эту панель навигации, когда пользователь дважды нажимает на экран.
Изначально панель навигации должна быть скрыта. Когда пользователь дважды нажимает на экран, на панели навигации должна появиться анимация, например, то, что можно увидеть в фотогалерее iPhone.
Как я могу сделать что-то это? Предложения всегда приветствуются.
10 ответов
Это не то, что может вписаться в несколько строк кода, но это один подход, который может работать для вас.
Чтобы скрыть панель навигации:
[[self navigationController] setNavigationBarHidden:YES animated:YES];
Чтобы показать это:
[[self navigationController] setNavigationBarHidden:NO animated:YES];
Документация по этому методу доступна здесь.
Чтобы прослушать "двойной щелчок" или двойное нажатие, подкласс UIView
и сделать экземпляр этого подкласса вашего контроллера представления view
имущество.
В подклассе представления переопределите его -touchesEnded:withEvent:
метод и подсчитайте, сколько касаний вы получаете за время, измеряя время между двумя последовательными нажатиями, возможно, с -timeIntervalSinceDate:
, Или проверить результат от [touch tapCount]
,
Если вы получили два касания, ваш подкласс NSNotification
что ваш контроллер просмотра зарегистрирован для прослушивания.
Когда ваш контроллер представления слышит уведомление, он запускает селектор, который либо скрывает, либо показывает панель навигации с использованием вышеупомянутого кода, в зависимости от текущего видимого состояния панели навигации, доступ к которому осуществляется посредством чтения панели навигации. isHidden
имущество.
РЕДАКТИРОВАТЬ
Часть моего ответа для обработки событий касания, вероятно, будет полезна еще до iOS 3.1. UIGestureRecognizer
Класс, вероятно, является лучшим подходом для обработки двойных нажатий в наши дни.
РЕДАКТИРОВАТЬ 2
Swift способ скрыть панель навигации:
self.navigationController?.setNavigationBarHidden(true, animated: true)
Чтобы показать это:
self.navigationController?.setNavigationBarHidden(false, animated: true)
Этот код поможет вам.
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];
}
}
Сначала прочтите раздел в Руководстве по программированию View Controller для iOS о "Принятии полноэкранного макета для представлений навигации" и раздел о том же для пользовательских представлений. Если вы пытаетесь сделать что-то вроде Photos.app, то вы, вероятно, используете представление с прокруткой. Обратите внимание на комментарий о том, что панели навигации автоматически добавляют вставку содержимого прокрутки в представление прокрутки, чтобы учесть высоту панели навигации (и строки состояния), поэтому вам необходимо сбросить свойство contentInset представления прокрутки обратно в ноль (UIEdgeInsetsZero) сразу после установка начального состояния панели навигации и до появления представления.
Затем, если у вас есть одно нажатие, которое переключает навигационную панель и / или строку состояния для отображения или скрытия, вам нужно сделать две вещи в вашем методе переключения. Первым кажется сохранить свойство contentOffset представления прокрутки перед изменением скрытого свойства NavigationBar и сразу после этого восстановить сохраненное значение в contentOffset. И второй, чтобы снова обнулить свойство contentInset до UIEdgeInsetsZero после изменения свойства navigationBarHidden. Кроме того, если вы переключаете строку состояния, вам необходимо изменить ее состояние перед изменением состояния панели навигации.
В 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
Вот очень быстрое и простое решение:
self.navigationController.hidesBarsOnTap = YES;
Это будет работать на одно нажатие вместо двойного нажатия. Также это изменит поведение для контроллера навигации даже после нажатия или выталкивания текущего контроллера представления.
Вы всегда можете изменить это поведение в вашем контроллере в пределах viewWillAppear: и viewWillDisappear: действия, если вы хотите установить поведение только для одного контроллера представления.
Вот документация:
Чтобы скрыть панель навигации:
[self.navigationController setNavigationBarHidden:YES animated:YES];
Чтобы показать панель навигации:
[self.navigationController setNavigationBarHidden:NO animated:YES];
Одним из способов может быть снятие флажка Видимость панели "Показывает панель навигации" в Инспекторе атрибутов. Надеюсь, это кому-нибудь поможет.
Если вы хотите определить статус панели навигации, пока она скрыта / отображается. Вы можете просто использовать следующий код для обнаружения -
if self.navigationController?.isNavigationBarHidden{
print("Show navigation bar")
} else {
print("hide navigation bar")
}
В 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
}
hidesBarsOnTap
на свойство UINavigationController выходить для обработки только это с iOS8 SDK
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
}
}