Отображение/скрытие панели навигации с плавной анимацией

У меня есть приложение на основе навигации. Первый вид (rootcontroller) начинается только с трех больших кнопок. Нет навигационной панели. Оттуда все остальное - это таблицы и имеют навигационные панели. Я делаю это, чтобы показать/скрыть панель навигации:

MyAppAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.navigationController.navigationBar.hidden = NO;

Как только я уйду из корневого контроллера, панель навигации подпрыгнет на место и встанет поверх таблицы, вместо того, чтобы отталкивать ее. Он зажимает верхнюю часть таблицы. Возврат к корневому контроллеру не является гладким в том, как панель навигации исчезает. Есть ли более гладкий/лучший способ выполнить скрытие панели навигации только для корневого контроллера?

Ответ 1

Вы можете использовать [navigationController setNavigationBarHidden: YES animated:YES], чтобы скрыть панель плавно

Reference

Ответ 2

Этот отличный фрагмент кода оживляет скрытую панель навигации без проблем пользовательского интерфейса:

[navigationController setNavigationBarHidden: YES animated:YES]

Но...

  • Используйте свойство self.navigationController.navigationBarHidden для проверки кода вместо свойства self.navigationController.navigationBar.hidden. Это избавит вас от боли от неожиданных проблем с позиционированием пользовательского интерфейса.
  • Поместите этот метод в - (void) viewWillAppear: (BOOL) анимированный или позже в жизненный цикл представления. Это рекомендуется, потому что, если вы делаете это в - (void) viewDidLoad, например, вы получите уродливый черный прямоугольный вид во время анимации из представления, которое отображает навигационную панель для представления, которое этого не делает! Например, если в вашем домашнем представлении скрыта панель навигации, но все его дети имеют отображаемую панель навигации, когда вы выходите на домашний взгляд, анимация покажет черную полосу вместо панели навигации, пока анимация не завершится.

Ответ 3

Вы можете настроить анимацию и продолжительность панели навигации следующими способами. Он предоставит вам обратный вызов после завершения анимации.

   // pass a param to describe the state change, an animated flag and a completion block matching UIView animations completion
    - (void)setNavigationBarVisible:(BOOL)visible animated:(BOOL)animated completion:(void (^)(BOOL))completion {

        // fail if the current state matches the desired state
        if ([self navigationBarIsVisible] == visible) return completion(YES);

        // get a frame calculation ready
        CGFloat nheight = self.navigationController.navigationBar.frame.size.height;
        CGFloat noffsetY = (visible)? -nheight : nheight;

        // zero duration means no animation
        CGFloat duration = (animated)? 0.3 : 0.0;

        [UIView animateWithDuration:duration animations:^{
            CGRect nframe = self.navigationController.navigationBar.frame;
            self.navigationController.navigationBar.frame = CGRectOffset(nframe, 0, noffsetY);
        } completion:completion];
    }

    // know the current state of the navigation bar
    - (BOOL)navigationBarIsVisible {
        return self.navigationController.navigationBar.frame.origin.y < CGRectGetMinY(self.view.frame);
    }

    // Show or Hide navigation bar
    [self setNavigationBarVisible:![self navigationBarIsVisible] animated:YES completion:^(BOOL finished) {
        NSLog(@"navigation bar finished");
    }];

Прежде чем скрыть панель навигации:

Прежде чем скрыть панель навигации:

После скрытия панели навигации:

После скрытия панели навигации: