Показувати / приховувати панель навігації


158

У мене є додаток з навігаційною панеллю, що складається з двох кнопок бару. Я хотів би сховати та показати цю панель навігації, коли користувач двічі торкається екрана.

Спочатку смугу навігації слід приховати. Коли користувач двічі торкається екрана, на навігаційній панелі має з’явитися анімація, як те, що можна побачити у фотогалереї iPhone.

Як я можу щось це зробити? Пропозиції завжди цінуються.

Відповіді:


381

Це не те, що може вписатись у кілька рядків коду, але це один підхід, який може працювати для вас.

Щоб приховати панель навігації:

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

Щоб показати це:

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

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

Для прослуховування "подвійного клацання" або подвійного торкання, підкласу UIViewта зробити примірник цього підкласу viewвластивості контролера перегляду .

У підкласі подання перегляньте його -touchesEnded:withEvent:метод і порахуйте, скільки дотиків ви отримаєте за тривалість часу, вимірюючи час між двома послідовними дотиками, можливо, з CACurrentMediaTime(). Або перевірити результат від [touch tapCount].

Якщо у вас є два дотики, ваш підкласовий вигляд видає NSNotificationте, що ваш контролер перегляду зареєстрований для прослуховування.

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

EDIT

Частина моєї відповіді на обробку подій на дотику, ймовірно, корисна ще до iOS 3.1. Цього дня UIGestureRecognizer, мабуть, кращий підхід для обробки подвійних натискань.

EDIT 2

Швидкий спосіб приховати панель навігації:

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

Спочатку прочитайте розділ у Посібнику з програмування контролера подання для iOS про те, що «Прийняття повноекранної розкладки для переглядів навігації» та розділ приблизно такий же для користувацьких представлень. Якщо ви намагаєтеся зробити щось на кшталт Photos.app, ви, ймовірно, використовуєте подання прокрутки. Зауважте, що коментарі до того, що панелі навігації автоматично додають у вікно прокрутки вкладений вміст прокрутки, щоб врахувати висоту панелі навігації (і рядка стану), тому вам доведеться скинути властивість contentInset вашого прокрутки назад до нуля (UIEdgeInsetsZero) відразу після встановлення початкового стану навігаційного бара та перед появою перегляду.

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


1
Дуже дякую за змістOffset та contentInset. Ви справжній герой.
Altealice

Я згоден, ви справжній герой тут! Дуже дякую.
Гаетан

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-му VC, але ви хочете відображати в 2-му VC-слові

У свій 1-й ВК напишіть цей код.

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 КОД: Це повністю працює для 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, є зайвою і може спонукати інших програмістів думати, що це є гарною практикою. Ви також зловживаєте чохлом верблюда та пропускаєте кінцевий брекет у своєму прикладі. Майте на увазі, оскільки також було оновлено швидкі селектори 2.2. Нарешті, швидка підтримка підтримується лише на iOS 7 і вище, і точно не працюватиме на iOS 3.2
David Rees
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.