Отображение / скрытие панели навигации с плавной анимацией - PullRequest
51 голосов
/ 17 января 2010

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

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

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

Ответы [ 3 ]

117 голосов
/ 17 января 2010

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

Ссылка

10 голосов
/ 26 марта 2014

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

[navigationController setNavigationBarHidden: YES animated:YES]

Но ...

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

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

   // 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");
    }];

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

Before hide a Navigation bar:

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

After hide a Navigation bar:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...