Swift4.0 - 自定义导航栏

现在为了方便项目的可扩展性我们都习惯用自定义的控件来覆盖系统的控件常用的就是自定义导航栏,今天我仿照OC自定义导航栏的方法来用Swift实现了,以供参考:

所有代码如下:

import UIKit

//遵循手势代理
class BaseNavigationController: UINavigationController,UINavigationControllerDelegate {

    var popDelegate:UIGestureRecognizerDelegate?
    
    override func viewDidLoad() {
        super.viewDidLoad()

        //navigationBar字体颜色设置
        self.navigationBar.barTintColor = UIColor.black
        //navigationBar字体颜色设置
        self.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.white]
        
        self.popDelegate = self.interactivePopGestureRecognizer?.delegate
        self.delegate = self
    }
    
    //MARK: - UIGestureRecognizerDelegate代理
    func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
        
        //实现滑动返回的功能
        //清空滑动返回手势的代理就可以实现
        if viewController == self.viewControllers[0] {
            
            self.interactivePopGestureRecognizer?.delegate = self.popDelegate
            
        } else {
            
            self.interactivePopGestureRecognizer?.delegate = nil;
        }
    }
    
    //拦截跳转事件
    override func pushViewController(_ viewController: UIViewController, animated: Bool) {
        
        if self.children.count > 0 {
            
            viewController.hidesBottomBarWhenPushed = true
            //添加图片
            viewController.navigationItem.leftBarButtonItem = UIBarButtonItem.init(image: UIImage.init(named: "navigation_left_back")?.withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(leftClick))
            //添加文字
            viewController.navigationItem.leftBarButtonItem = UIBarButtonItem.init(title: "返回", style: .plain, target: self, action: #selector(leftClick))
        }
        super.pushViewController(viewController, animated: animated)
        
    }
    
    //返回上一层控制器
    @objc func leftClick()  {
        
        popViewController(animated: true)
        
    }
    
    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */

}

注:在设置返回item只有图片的时候,有一个坑需要注意,就是如果仅仅直接把图片是加上去而没有设置图片的渲染类型,这样效果去蓝颜色的显示的,再初始化图片的时候需要把图片的渲染效果.withRenderingMode(.alwaysOriginal)也给加上这样才是你设置的图片的

代码:

 viewController.navigationItem.leftBarButtonItem = UIBarButtonItem.init(image: UIImage.init(named: "navigation_left_back")?.withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(leftClick))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,236评论 4 61
  • 2018年12月15日星期六晴 这个周六小奥很忙碌,时间被排的满满的,上课时间和玩的时间全聚集在了今天,小奥...
    扬帆起航__爱之语阅读 962评论 0 0
  • 最近一段时间,每天下班后吃晚饭的时候都会追一集《北京女子图鉴》,这部剧是由戚薇领衔主演的,讲述的是一名四川乐山小镇...
    霞姝儿阅读 3,483评论 0 0
  • 悠然自适,方得自然
    雨落随川阅读 1,716评论 0 0
  • 这几天看《弗洛伊德传》,终于看到了一个我们所不知道的伟人,弗洛伊德从小就是一个聪明的孩子,读中学时,学习成绩连续7...
    我是岸阅读 4,470评论 0 2