Скрываем 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:

UINavigationBar_hide_1_proSwift_ru

 

Обратите внимание на 2 вещи!

  1. 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) заставляем его появится на экране не зависимо от того скрыт он был или нет.

  2. Возможнозностей скрывать UINavigationBar по какому либо событию достаточно много. Apple любезно предоставила нам такую возможность. Посмотрите в документации свойства, хотя из названий этих свойств и так все понятно.
    //
    // proSwift.ru
    // 
    
    navigationController?.hidesBarsOnTap
    navigationController?.hidesBarsWhenKeyboardAppears
    navigationController?.hidesBarsWhenVerticallyCompact
    navigationController?.hidesBottomBarWhenPushed

     


Ссылка проекта на GitHub

https://github.com/Ironrnd/UITableViewAutomaticDimension

 

 

2 Comments on “Скрываем UINavigationBar при прокручивании таблицы

  1. Как скрыть понятно и за это спасибо, но как его вернуть красиво назад при прокрутке вверх?

Добавить комментарий для Андрей Отменить ответ

Ваш адрес email не будет опубликован.

*

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.