it-swarm.com.ru

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

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

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

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

51
4thSpace

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

ссылка

117
James Raybould

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

[navigationController setNavigationBarHidden: YES animated:YES]

Но ...

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

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

   // 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:

3
Vignesh Kumar