自定义UINavigationController为了全局设置leftBarButtonItem样式、设置push时隐藏底部Bar。
第一步:
先继承 UINavigationController,先声明需要设置的隐藏底部的视图控制器数组
let controllerNameArray = ["", "", "", "",""]
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
navigationBar.isTranslucent = false
if responds(to: #selector(getter: interactivePopGestureRecognizer)) {
interactivePopGestureRecognizer?.delegate = self
delegate = self
}
}
第二步:
重写pushViewController的父类方法并设置push时需要隐藏的控制器,并为push后的视图添加返回按钮
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
if self.responds(to: #selector(getter: interactivePopGestureRecognizer)) {
interactivePopGestureRecognizer?.isEnabled = false
}
if controllerNameArray.contains(String(describing: viewController.classForCoder)) == false {
viewController.hidesBottomBarWhenPushed = true
}
super.pushViewController(viewController, animated: animated)
if viewControllers.first != viewController {
checkItem(viewController)
}
}
func checkItem(_ viewController: UIViewController) {
viewController.navigationItem.leftBarButtonItem = UIBarButtonItem(image: UIImage.init(imageLiteralResourceName: "backdcopy").imageWithTintColor(color: AppTheme.shared.secondColor!).withRenderingMode(UIImage.RenderingMode.alwaysOriginal), style: UIBarButtonItem.Style.plain, target: self, action: #selector(backSuperiorController))
}
@objc func backSuperiorController() {
if self.responds(to: #selector(getter: interactivePopGestureRecognizer)) {
interactivePopGestureRecognizer?.isEnabled = false
}
popViewController(animated: true)
}
第三步:
设置代理方法,并实现侧滑返回
extension KJNavigationController: UINavigationControllerDelegate {
func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
if responds(to: #selector(getter: interactivePopGestureRecognizer)) {
interactivePopGestureRecognizer?.isEnabled = true
}
}}
extension KJNavigationController: UIGestureRecognizerDelegate {
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}}
看上去已经准备好了,开始使用的时候并不会出现什么问题,等到测试的时候会偶现界面假死的情况。原因是因为当UIViewController是导航栏的根视图的时候
interactivePopGestureRecognizer仍然是可用的,改进后如下:
extension KJNavigationController: UINavigationControllerDelegate {
func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
if responds(to: #selector(getter: interactivePopGestureRecognizer)) {
interactivePopGestureRecognizer?.isEnabled = self.viewControllers.count > 1
}
}}
记录一下
网友评论