完善UINavigationController

导航控制器是App中常用的一种控制器,但是系统提供的UINavigationController并不完善,下面举两个例子以及对应的改善方案。

  • 当隐藏NavigationBar或者自定义 back BarButtonItem时,边界滑动返回的功能失效。

解决方案:自定义UINavigationController的子类,或者使用root view controller作为代理,实现UINavigationControllerDelegategestureRecognizerShouldBegin()方法,当子控制器数量大于1时,返回true

func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    if viewControllers.count > 1 {
      return true
    }
    return false
}
  • 当快速点击两个按钮,分别启动pop view controllerpush view controller操作时,系统会把两个动作依次完成,可能会导致控制器栈顺序错乱。

解决方案:如果App有controller正在push或者pop,禁止启动第二次push和pop操作,或者加入队列中,等前一次动画结束再启动下一个操作,同时禁用手势操作interactivePopGestureRecognizer.isEnable = false,等回调控制器已经显示的代理方法后还原设置。

func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
       isAnimated = false
       interactivePopGestureRecognizer?.isEnabled = true
       // pop queue view controllers
       dequeueViewController(navigationController)
   }

完整代码:NavigationController.m

你可能感兴趣的:(完善UINavigationController)