Скрываем UINavigationBar при прокручивании таблицы
В этой статье я расскажу, как скрывать UINavigationBar в контроллере, в котором есть таблица UITableView при скроллинге или прокручивании таблицы вниз и возвращать его при скроллинге вверх.
На самом деле раньше я решал данную задачу с помощью делегата UIScrollView, вычисляя куда и как сильно скроллится таблица. Но есть куда более простой способ скрыть и показать UINavigationBar при скроллинге таблицы.
Я в качестве примера использовал проект из предыдущей статьи, в которой мы делали ячейки с автоматическим размером под содержимое. Нужно обернуть (Editor -> Embed In -> Navigation Controller) контроллер с таблицей в UINavigationController. Но способ, который я опишу ниже будет работать с любым UINavigationBar / UINavigationController.
Необходимо добавить метод жизненнго цикла ViewController viewWillAppear()
// // proSwift.ru // override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) navigationController?.hidesBarsOnSwipe = true }
Через опциональное свойство контролера navigationController? мы обращаемся к свойству бара — hidesBarsOnSwipe и устанавливаем в него значение true. Про другие полезные свойства UIViewController написано тут.
Результатом этих изменений станет анимация нашего UINavigationBar:
Обратите внимание на 2 вещи!
- UINavigationBar является единственным для всего стека контроллера, которые в нем отображаются. Поэтому если в каком либо из контроллеров, которые будут отображены в дальнейшем этот бар нужен (на нем обычно расположены кнопки действий — такие как назад или добавить и.т.п.), а он будет скрыт при начале перехода — то произойдет пичалька…
Решается проблема очень просто. В контроллере, который в любом случае должен отображать UINavigationBar в методе жизненного цикла viewWillAppear() нужно установить следующие свойства:// // proSwift.ru // override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) navigationController?.hidesBarsOnSwipe = false navigationController?.setNavigationBarHidden(false, animated: true) }
Опять таки обращаемся к UINavigationController, который содержит наш контроллер, отменяем ему возможность прятаться по свайпу, и методом setNavigationBarHidden(false, animated: true) заставляем его появится на экране не зависимо от того скрыт он был или нет.
- Возможнозностей скрывать UINavigationBar по какому либо событию достаточно много. Apple любезно предоставила нам такую возможность. Посмотрите в документации свойства, хотя из названий этих свойств и так все понятно.
// // proSwift.ru // navigationController?.hidesBarsOnTap navigationController?.hidesBarsWhenKeyboardAppears navigationController?.hidesBarsWhenVerticallyCompact navigationController?.hidesBottomBarWhenPushed
Ссылка проекта на GitHub
https://github.com/Ironrnd/UITableViewAutomaticDimension
Как скрыть понятно и за это спасибо, но как его вернуть красиво назад при прокрутке вверх?
Похоже, так только у меня глючит. Xcode 9