歡迎光臨
每天分享高質量文章

iOS導航欄的正確隱藏方式

作者:倚樓聽風雨wing

連結:https://www.jianshu.com/p/1f72cd2771fe

NagigationBar.gif

簡介

在專案中經常碰到首頁頂部是無限輪播,需要靠最上面顯示.有的設定導航欄為透明等一系列的方法,這個可以藉助第三方.或者乾脆簡單粗暴的直接隱藏掉導航欄.可是push到下一個頁面的時候是需要導航欄的,如何做了,這裡給出三種方法.

第一種做法

註意這裡一定要用動畫的方式隱藏導航欄,這樣在使用滑動傳回手勢的時候效果最好,和上面動圖一致.這樣做有一個缺點就是在切換tabBar的時候有一個導航欄向上消失的動畫。

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [self.navigationController setNavigationBarHidden:YES animated:animated];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    [self.navigationController setNavigationBarHidden:NO animated:animated];
}

第二種做法

設定self為導航控制器的代理,實現代理方法,在將要顯示控制器中設定導航欄隱藏和顯示,使用這種方式不僅完美切合滑動傳回手勢,同時也解決了切換tabBar的時候,導航欄動態隱藏的問題。最後要記得在控制器銷毀的時候把導航欄的代理設定為nil。


@interface WLHomePageController () <UINavigationControllerDelegate>

@end

@implementation WLHomePageController 

#pragma mark - lifeCycle
- (void)viewDidLoad {
    [super viewDidLoad];

    // 設定導航控制器的代理為self
    self.navigationController.delegate = self;
}

#pragma mark - UINavigationControllerDelegate
// 將要顯示控制器
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    // 判斷要顯示的控制器是否是自己
    BOOL isShowHomePage = [viewController isKindOfClass:[self class]];

    [self.navigationController setNavigationBarHidden:isShowHomePage animated:YES];
}

- (void)dealloc {
    self.navigationController.delegate = nil;
}

第三種做法

主要是針對A隱藏Nav, A push 到B,B也需要隱藏Nav的這種情況

1、自定義UINavigationController

#import "WYNavigationController.h"
#import "ViewController.h"
#import "WYTargetVC.h"


@interface WYNavigationController ()<UINavigationControllerDelegateUIGestureRecognizerDelegate>

@end

@implementation WYNavigationController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.delegate = self;
    // 設定全屏滑動傳回
    id target = self.interactivePopGestureRecognizer.delegate;
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
    [self.view addGestureRecognizer:pan];
    self.interactivePopGestureRecognizer.enabled = NO;
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (self.viewControllers.count > 0) {
        viewController.hidesBottomBarWhenPushed = YES;
    }
    [super pushViewController:viewController animated:animated];
}


#pragma mark - UINavigationControllerDelegate
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    // 判斷如果是需要隱藏導航控制器的類,則隱藏
    BOOL isHideNav = ([viewController isKindOfClass:[ViewController class]] || 
                      [viewController isKindOfClass:[WYTargetVC class]]);

    [self setNavigationBarHidden:isHideNav animated:YES];
}

但是註意setNavigationBarHidden:YES設定這行程式碼後會導致Nav的滑動傳回手勢失效,這也就是為什麼前面我們在自定義導航的時候需要設定全屏滑動傳回了。在這裡可能有人會說我不想要全屏傳回,我就想要原本系統滑動傳回的樣式,怎麼辦。歡迎大家在留言區發表你的看法。

Demo:https://github.com/wangyansnow/WYNagigationDemo



編號311,輸入編號直達本文

●輸入m獲取文章目錄

推薦↓↓↓

Web開發

更多推薦18個技術類微信公眾號

涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

贊(0)

分享創造快樂