iOS DevelopmentiOS学习征服iOS

iOS ---- 自定义返回按钮图片和侧滑返回失效问题

2017-02-10  本文已影响159人  71150ce14a00

我们可以 创建一个类继承UINavigationController也可以在BaseViewController中写,我这里是从navigationcontroller中写的
项目传送门
在继承UINavigationController的类中 实现方法

override func pushViewController(_ viewController: UIViewController, animated: Bool) {
    if self.viewControllers.count > 0 {
        //重写返回按钮
        let btn = UIButton.init(type: .custom)
        btn.frame = CGRect.init(x: 0, y: 0, width: 50, height: 44)
        btn.addTarget(self, action: #selector(popToPre), for: .touchUpInside)
        btn.setImage(UIImage.init(named: "back"), for: .normal)
        btn.imageEdgeInsets = .init(top: 0, left: -30, bottom: 0, right: 0)
        let leftNavItem = UIBarButtonItem.init(customView: btn)
        viewController.navigationItem.leftBarButtonItem = leftNavItem
        
        // 动态隐藏tabbar 
    viewController.hidesBottomBarWhenPushed = true
    }
    super.pushViewController(viewController, animated: true)
}
  // 之所以不用系统的popViewController 是因为tabbar 返回动画bug
 func popToPre()
{
    self.popViewController(animated: true)
}

这样一个自定义按钮就完成了, 不过当你完成的时候你会发现,侧滑返回手势失效了

不用担心 看这里 ——————————

同样也是在继承UINavigationController的类中实现UINavigationControllerDelegate代理
在viewDidLoad中

  var popDelegate: UIGestureRecognizerDelegate?
override func viewDidLoad() {
    super.viewDidLoad()
    self.popDelegate = self.interactivePopGestureRecognizer?.delegate
    self.delegate = self
}

接下来实现Navigation代理方法

  //UINavigationControllerDelegate方法
func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
    //实现滑动返回功能
    //清空滑动返回手势的代理就能实现
    if viewController == self.viewControllers[0] {
        self.interactivePopGestureRecognizer!.delegate = self.popDelegate
    }
    else {
        self.interactivePopGestureRecognizer!.delegate = nil
    }
}

这样侧滑返回手势就添加上去了,利用UIGestureRecognizerDelegate还可以添加全局滑动返回手势
这里就不详细说明......

上一篇下一篇

猜你喜欢

热点阅读