如何隐藏NavigationController

IOS

如何隐藏NavigationController?

隐藏NavigationController只需要调用一个方法就可以了:

//OC
self.navigationController.navigationBar.hidden = YES;

要回复它只用把状态改为NO就好。

ScrollView或TableView向上滑动隐藏NavigationController

如果是在一个ScrollView或者是一个TableView里面,想要实现向上滑动隐藏NavigationController,调用这个函数即可:

//OC
-(void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{
    if (velocity.y > 0.0)
    {
        //向上滑动隐藏导航栏
        [self.navigationController setNavigationBarHidden:YES animated:YES];
    }else
    {
        //向下滑动显示导航栏
        [self.navigationController setNavigationBarHidden:NO animated:YES];
    }
}

其中

//OC
[self.navigationController setNavigationBarHidden:YES animated:YES];

是带有动画效果的,如果不需要动画效果可以直接用

//OC
self.navigationController.navigationBar.hidden = YES;

不过应该不会有人不想用动画效果吧

效果图:

hide NavigationController


当然从效果图来看这样实现并不好,因为StatusBar和tableView的内容重合了,现在可以做一点优化。

在viewDidLoad里面添加:

//OC
[self setNeedsStatusBarAppearanceUpdate];

添加一个函数:

//OC
- (UIStatusBarStyle)preferredStatusBarStyle
{
    
    return UIStatusBarStyleLightContent;
}

效果图:

“Hide”status bar


那如果要"保留"StatusBar要怎么做呢?

网上查了一下,有一个思路是把NavigationController的高度降为22,这样看起来就像是保留了StatusBar。

//OC

@property (assign, nonatomic)BOOL isHidden;
//…………

-(void)showNavigationController{
    if (self.isHidden) {
        CGRect frame = self.navigationController.navigationBar.frame;
        frame.origin.y = 20;
        [UIView animateWithDuration:0.2 animations:^{
            self.navigationController.navigationBar.frame = frame;
            
            [self.item setTitle:@"item"];
            self.title = @"Title";
        }];
        self.isHidden= NO;
    }
}

-(void)hideNavigationController{
    if (!self.isHidden) {
        CGRect frame = self.navigationController.navigationBar.frame;
        frame.origin.y = -24;
        [UIView animateWithDuration:0.2 animations:^{
            self.navigationController.navigationBar.frame = frame;
            
//			  隐藏navigationController上的控件
            [self.item setTitle:@""];
            self.title = @"";
        } completion:nil];
        self.isHidden=YES;
    }
}

然后修改下scrollViewWillEndDragging就可以了

//OC
-(void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{
    if (velocity.y > 0.0)
    {
        //向上滑动隐藏导航栏
        [self hideNavigationController];
        
    }else
    {
        //向下滑动显示导航栏
        [self showNavigationController];
    }
}

效果图:

代码下载 Xcode6.4

##iOS8之后

//objective-c
self.navigationController.hidesBarsOnSwipe = YES;
//swift
self.navigationController!.hidesBarsOnSwipe = true;