1. 程式人生 > >Swift NavigationBar隱藏後的右滑手勢

Swift NavigationBar隱藏後的右滑手勢

需求

我們在開發中經常遇見這樣的需求,就是A檢視沒有導航,pushB檢視後導航欄。然後要求可以使用iOS的系統側滑返回功能。類似如下的功能:

問題

在處理這個需求的時候,我們一般會遇到兩個問題:

右滑返回手勢

iOS開發中,使用push檢視,系統是有預設的側滑返回上個檢視的功能。但是當我們自定義導航欄時,這個手勢的事件就沒有再觸發,此時只要我們重新將代理設定為controller即可。
程式碼示例:
在BaseViewController中新增如下的程式碼

   //開啟 push檢視 右滑手勢()
   fileprivate func openSwipe(){
    if
(self.navigationController != nil){ self.navigationController!.interactivePopGestureRecognizer!.delegate = self; } } func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { if self.navigationController?.viewControllers.count == 1{ return
false; } return true; }

或者在BaseNavigationController中新增如下程式碼:

extension BaseNavigationController:UIGestureRecognizerDelegate{

    override func viewDidLoad() {
        super.viewDidLoad()
        self.interactivePopGestureRecognizer?.delegate = self
    }
    func gestureRecognizerShouldBegin(_
gestureRecognizer: UIGestureRecognizer) -> Bool { if self.viewControllers.count == 1{ return false; } return true; } }
右劃返回時導航欄的隱藏問題

oc程式碼:

-(void)viewWillAppear:(BOOL)animated{
       [self.navigationController setNavigationBarHidden:YES animated:true];
}

-(void)viewWillDisappear:(BOOL)animated{
  [self.navigationController setNavigationBarHidden:NO animated:false];
}

swift程式碼:

 override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(false);
        self.navigationController?.setNavigationBarHidden(true, animated: true)


    }
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated);
        self.navigationController?.navigationBar.isHidden = false;
    }
注意點

我們隱藏導航欄的時候,務必使用animated為true.這樣在右劃返回檢視的時候才不會突兀,否則則會是下面的效果。剛開始滑動,導航欄就全不見了。
這裡寫圖片描述