解決使用系統自帶側滑返回時頁面導航欄顯示問題

需求(bug)背景:
項目里面有個需求是:在當前頁面隱藏導航欄和修改狀態欄,其它界面導航欄狀態未知(可能顯示可能隱藏導航欄);各個頁面支持路由任意跳轉.一般做法是在viewWillAppear 和viewWillDisappear 里面設置和重置導航欄狀態.但是產品要求支持側滑返回,當用戶側滑到一半取消返回這個時候,再push到下一個頁面,下一個頁面導航欄狀態可能會受到影響.
但是下一個頁面是未知的,有可能在viewWillAppear 和viewWillDisappear 等生命周期方法里面做了處理,有可能沒有. 我們無法得知更無法干涉下一個頁面情況,所以只能在當前頁面做處理.

主要是利用了,下面兩個代理方法,監聽系統側滑返回時候的拖拽結果

- (void)willMoveToParentViewController:(UIViewController*)parent
- (void)didMoveToParentViewController:(UIViewController*)parent

根據parent 是否為null判斷側滑返回是否成功

進入當前頁面
直接點擊返回按鈕退出頁面
拖拽返回不pop當前頁面
拖拽返回pop當前頁面
下一個頁面拖拽返回不pop當前頁面打印

下一個頁面pop當前頁面打印

通過調試發現, willMoveToParentViewController:,分別在viewWillAppear,viewDidAppear, viewWillDisappear,viewDidDisappear 之前調用; didMoveToParentViewController:分別在viewDidAppear 和viewDidDisappear 之后調用

我的解決辦法是:
當前VC增加一個屬性,記錄側滑返回狀態,在合適的時機更新這個值,根據這個值進行判斷邏輯

@property(nonatomic, assign) BOOL isDragToPopSuccess; /**< 是否拖拽返回 */
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"Yann******====%@",@"viewWillAppear");
    self.isDragToPopSuccess = NO; //  更新isDragToPopSuccess
    // 設置狀態欄和其他信息
    [self.timerManager startTimer];
    [[VCManager getNavigationVC] setNavigationBarHidden:YES animated:NO];
}
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"Yann******====%@",@"viewWillDisappear");
    
    if (self.isDragToPopSuccess) { // 拖拽返回時候隱藏導航欄
        [[VCManager getNavigationVC] setNavigationBarHidden:YES animated:NO];
    } else { // 非拖拽返回, 說明是push到下一個頁面消失
        // 還原配置
        [[VCManager getNavigationVC] setNavigationBarHidden:NO  animated:NO];
        [self.timerManager stopTimer];
        self.statusBarStyle =  UIStatusBarStyleDefault;
        [self setNeedsStatusBarAppearanceUpdate];
    }  
}

- (void)willMoveToParentViewController:(UIViewController*)parent{
    [super willMoveToParentViewController:parent];
    NSLog(@"Yann******====%@,%@",@"willMoveToParentViewController",parent);
    if(!parent){ // 拖拽返回
        self.isDragToPopSuccess = YES;
    } else {
        self.isDragToPopSuccess = NO;
    }
}
- (void)didMoveToParentViewController:(UIViewController*)parent{
    [super didMoveToParentViewController:parent];
    NSLog(@"Yann******====%@,%@",@"didMoveToParentViewController",parent);
    if(!parent){
        NSLog(@"Yann******====頁面pop成功了");
    } else { // 滑動pop失敗
        self.isDragToPopSuccess = NO;
    }
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容