用stream畅的animation显示/隐藏导航栏

我有一个基于导航的应用程序。 第一个视图(rootcontroller)只有三个大button。 没有导航栏。 从那里,一切都是桌面和导航栏。 我正在做这个来显示/隐藏导航栏:

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

一旦我离开根控制器,导航栏就会跳到位置,并放在桌面视图的顶部,而不是推下来。 它剪辑桌面的顶部。 回到根控制器在导航栏如何消失不平滑。 是否有一个更顺利/更好的方法来完成只隐藏根控制器的导航栏?

您可以使用[navigationController setNavigationBarHidden: YES animated:YES]平滑地隐藏栏

参考

这个漂亮的代码animation导航栏隐藏没有UI问题:

[navigationController setNavigationBarHidden: YES animated:YES]

但…

  1. 在代码中使用self.navigationController.navigationBarHidden属性进行检查,而不是self.navigationController.navigationBar.hidden属性。 这将为您解决意外的UI定位问题带来很多痛苦。
  2. 请注意将此方法置于视图生命周期中的– (void)viewWillAppear:(BOOL)animation或更高版本中。 这是build议的,因为如果你在– (void)viewDidLoad中做的话,你将会在一个视图的animation过程中看到一个丑陋的黑色矩形视图,该视图将导航栏显示到一个视图上。 例如,如果您的主视图隐藏了其导航栏,但其所有子项都显示了导航栏,则当您popup到主视图时,animation将显示一个黑条代替导航栏,直到animation完成

您可以通过以下方法自定义导航栏animation和持续时间。 一旦animation完成,它将为您提供callback。

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

隐藏导航栏之前:

隐藏导航栏之前:

隐藏导航栏后:

隐藏导航栏后: