我们可以 创建一个类继承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还可以添加全局滑动返回手势
这里就不详细说明......
网友评论