У меня есть код ниже, который скрывает и показывает навигационную панель. Он скрывается, когда загружается первое представление, а затем скрывается, когда вызывается «потомок». Беда в том, что я не могу найти событие / действие, которое заставит его скрыться снова, когда они вернутся к корневому представлению ....
У меня есть кнопка «Тест» на корневой странице, которая выполняет действие вручную, но это не красиво, и я хочу, чтобы это было автоматически.
-(void)hideBar
{
self.navController.navigationBarHidden = YES;
}
-(void)showBar
{
self.navController.navigationBarHidden = NO;
}
источник
animated=YES
. Я знаю, это выглядит некрасивоanimated=NO
, но кажется, что когда анимация для скрытия панели навигации еще не закончена, анимация для ее отображения снова игнорируется. Решения пока нет.Другой подход, который я нашел, - установить делегата для
NavigationController
:и использовать
setNavigationBarHidden
вnavigationController:willShowViewController:animated:
Простой способ настроить поведение для каждого
ViewController
в одном месте.источник
Один небольшой трюк, который я должен был сделать на других ответах, состоит в том, чтобы только показать панель в viewWillDisappear, если причина, по которой она исчезает, связана с нажатием на нее элемента навигации. Это потому, что вид может исчезнуть по другим причинам.
Поэтому я могу только показать панель, если это представление больше не является самым верхним:
источник
Я бы поместил код в делегат viewWillAppear для каждого отображаемого представления:
Вот так, где вам нужно это скрыть:
Вот так, где вам нужно показать это:
источник
В настоящее время принятый ответ не соответствует предполагаемому поведению, описанному в вопросе. Вопрос требует, чтобы панель навигации была скрыта на корневом контроллере представления, но видна везде, но принятый ответ скрывает панель навигации на конкретном контроллере представления. Что происходит, когда другой экземпляр первого контроллера представления помещается в стек? Он скроет панель навигации, даже если мы не смотрим на контроллер корневого представления.
Вместо этого, стратегия @Chad M. по использованию
UINavigationControllerDelegate
является хорошей, и вот более полное решение. шаги:UINavigationController
-navigationController:willShowViewController:animated
метод, чтобы показать или скрыть панель навигации в зависимости от того, показывает ли она контроллер корневого представленияПолный код для этого решения можно найти в этой Gist . Вот
navigationController:willShowViewController:animated
реализация:источник
в Свифте 3:
источник
navcontroller.navagationBarHidden
его, он сломает весь навигационный контроллер (без пролистывания туда-сюда). Чтобы заставить его работать, я использовалnavigationController?.navigationBar.hidden
вместо этого. Смахивание все еще работает, и оно не оставляет пустого пространства, потому что кажется, что оно находится внутри стека или что-то в этом родеОтдай должное ответу @ chad-m.
Вот версия Swift:
MyNavigationController.swift
Разница между ответом Чад-м и моим:
Наследуйте от UINavigationController, чтобы вы не загрязняли свой rootViewController.
используйте
self.viewControllers.first
вместоhomeViewController
, поэтому вы не будете делать это 100 раз для своих 100 контроллеров UINavigation в 1 StoryBoard.источник
После нескольких испытаний я понял, как это работает так, как я хотел. Это то, что я пытался. - У меня есть вид с изображением. и я хотел, чтобы изображение было полноэкранным. - У меня есть навигационный контроллер с TabBar тоже. Так что мне тоже нужно это скрывать. - Кроме того, моим главным требованием было не просто скрываться, но и иметь эффект затухания при показе и скрытии.
Вот как я получил это работает.
Шаг 1 - У меня есть изображение, и пользователь нажимает на него один раз. Я фиксирую этот жест и вставляю его в новый
imageViewController
,imageViewController
хочу получить полноэкранное изображение.Шаг 2 - Все эти шаги ниже находятся в ImageViewController
Шаг 2.1 - В ViewDidLoad показать navBar
Шаг 2.2 - В
viewDidAppear
, установите задачу таймера с задержкой (у меня она установлена на задержку в 1 секунду). А после задержки добавьте эффект затухания. Я использую альфа, чтобы использовать исчезновение.Шаг 2.3 - Под
viewWillAppear
, добавьте жест SingleTap к изображению и сделайте navBar полупрозрачным.Шаг 3 - Наконец
viewWillDisappear
, убедитесь, что все вещи обратноисточник
В случае, если у кого-то все еще есть проблемы с быстрым обратным перемещением, ошибка отменяется, как прокомментировал @fabb в принятом ответе.
Мне удается исправить это путем переопределения
viewDidLayoutSubviews
, в дополнение к тому,viewWillAppear/viewWillDisappear
как показано ниже:В моем случае я заметил, что это потому, что контроллер корневого представления (где скрыта навигация) и контроллер удаленного просмотра (показывается навигация) имеют разные стили строки состояния (например, темный и светлый). В тот момент, когда вы запускаете обратную прокрутку, чтобы открыть контроллер представления, появится дополнительная цветовая анимация строки состояния. Если вы отпустите палец для отмены интерактивного всплывающего окна , пока анимация строки состояния не закончена , панель навигации исчезнет навсегда!
Однако эта ошибка не возникает, если стили строки состояния обоих контроллеров представления совпадают.
источник
Если вы хотите полностью скрыть панель навигации в контроллере, гораздо более чистое решение - в корневом контроллере иметь что-то вроде:
Когда вы нажимаете дочерний вид в контроллере, панель навигации остается скрытой; если вы хотите отобразить его только в дочернем элементе, вы добавите код для отображения
it(self.navigationController.navigationBarHidden=NO;)
вviewWillAppear
обратном вызове, а также код для его скрытияviewWillDisappear
источник
Простейшая реализация может состоять в том, чтобы каждый контроллер представления указывал, скрыта ли его панель навигации в его
viewWillAppear:animated:
методе. Тот же подход хорошо работает и для скрытия / отображения панели инструментов:источник
Спрятать панель навигации только на первой странице можно и через раскадровку. На раскадровке перейдите в Сцена навигации контроллера -> Панель навигации . И выберите свойство « Скрытый » в инспекторе Атрибутов . Это скроет панель навигации, начиная с первого viewcontroller, пока она не станет видимой для требуемого viewcontroller.
Навигационная панель может быть установлена обратно видимой в обратном вызове ViewWillAppear ViewController.
источник
Свифт 4:
В контроллере представления вы хотите скрыть панель навигации.
источник
Внедрив этот код в свой ViewController, вы можете получить этот эффект. На самом деле хитрость заключается в том, чтобы скрыть панель навигации при запуске этого контроллера.
и показать панель навигации, когда пользователь покидает эту страницу, это viewWillDisappear
источник