我有一个基于导航的应用程序。第一个视图(rootcontroller)仅以三个大按钮开头。没有导航栏。从那里,其他一切都是tableviews和导航栏。我这样做是为了显示/隐藏导航栏:
MyAppAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.navigationController.navigationBar.hidden = NO;
一旦我离开根控制器,导航栏就会突然移动到位于桌面视图的顶部,而不是将其向下推。它剪辑了tableview的顶部。回到根控制器并不是导航栏消失的方式。是否有更顺畅/更好的方法来完成隐藏根控制器的导航栏?
答案 0 :(得分:117)
您可以使用[navigationController setNavigationBarHidden:YES animated:YES]
平滑地隐藏栏。
答案 1 :(得分:10)
这段漂亮的代码可以隐藏导航栏,不会出现任何UI问题:
[navigationController setNavigationBarHidden: YES animated:YES]
答案 2 :(得分: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");
}];