ios开发框架封装(三):封装导航栏NavigationController

221 阅读3分钟

先放demo地址:github.com/KeWangKW/99…

  • 基于swift5实现,也适用于OC ,demo中有简单的使用示例
  • gif演示

屏幕录制2023-06-20 09.49.37.gif

普通导航栏使用:

let vc = UIViewController()
let nav = KWNavigationController(rootViewController: vc)
UIViewController * vc = [[UIViewController alloc]init];
KWNavigationController * nav = [[KWNavigationController alloc]initWithRootViewController:vc];
  • 可以在UIViewController+KWNavigationBar 中定义好常用的导航栏样式,在自定义ViewController中调用,也可以在自定义的ViewController中直接修改导航栏属性:
    • 属性如下:
      • kw_statusBarStyle:状态栏字体颜色【默认 .defult】
      • kw_tintColor:导航栏前景色(左右按钮颜色)【默认黑色】
      • kw_titleColor:导航栏标题文字颜色【默认黑色】
      • kw_titleFont:导航栏标题文字字体【默认17号粗体】
      • kw_backgroundColor:导航栏背景色【默认白色】
      • kw_backgroundImage:设置导航栏背景图片
      • kw_barAlpha:导航栏背景透明度【0~1 , 默认1】
      • kw_shadowHidden:导航栏底部分割线是否隐藏【默认不隐藏】
      • kw_shadowColor:导航栏底部分割线颜色
      • kw_enablePopGesture:是否开启手势返回,【默认开启】
      • 【使用时如果当前页面需要以上属性会因某些事件变化 或者 使用渐变属性,将以上设置写在ViewWillAppear中或导致返回此页面时导航栏刷新成当前样式,建议统一在 ViewDidLoad 方法中处理】
    • 使用示例Swift:
      • kw_statusBarStyle = .lightContent
      • kw_tintColor = .black
      • kw_titleColor = .black
      • kw_titleFont = .systemFont(ofSize: 29, weight: .bold)
      • kw_backgroundColor = .red
      • kw_shadowColor = .yellow
      • kw_backgroundImage = UIImage(named: "ic_video_dhTBG")
    • 使用示例OC:
      • self.kw_statusBarStyle = UIStatusBarStyleLightContent;
      • self.kw_tintColor = [UIColor random];
      • self.kw_titleColor = [UIColor random];
      • self.kw_titleFont = [UIFont systemFontOfSize:29 weight:UIFontWeightBold];
      • self.kw_backgroundColor = [UIColor random];
      • self.kw_shadowColor = [UIColor random];
      • self.kw_backgroundImage = [UIImage imageNamed:@"ic_video_dhTBG"];

透明导航栏使用:

  • UIViewController+KWNavigationBar 中定义了 nav_color_clear 方法,在自定义viewcontroller中调用即可,如其他颜色不符合要求请自行修改或定义
override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        nav_color_clear()
    }
- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [self nav_color_gradient:[UIColor whiteColor]];
    [self nav_color_clear];
}

透明渐变导航栏使用:

  • UIViewController+KWNavigationBar 中定义了 nav_color_gradient 方法,在自定义viewcontroller中调用即可,如其他颜色不符合要求请自行修改或定义
  • viewController需遵守协议 UIScrollViewDelegate
  • 设置默认透明导航栏,渐变色为白色
  • 导航栏属性设置不要写在 viewWillAppear 中,手势返回取消 或者 pop回此页面 时,会导致导航栏刷新成透明样式
override func viewDidLoad() {
        super.viewDidLoad()
        nav_color_gradient(.white)
    }
  • 随页面滑动,处理颜色变化
@objc func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let contentOffsetY = scrollView.contentOffset.y
        let progress = min(1, max(0, contentOffsetY / 60))
        if progress < 0.1 {
            kw_statusBarStyle = .lightContent
            kw_tintColor = .white
            kw_titleColor = .white
        } else {
            if #available(iOS 13.0, *) {
                kw_statusBarStyle = .darkContent
            } else {
                kw_statusBarStyle = .default
            }
            kw_tintColor = UIColor(white: 0, alpha: progress)
            kw_titleColor = UIColor(white: 0, alpha: progress)
        }
        kw_barAlpha = progress
    }

其他:

  • 修改 自定义 导航栏返回按钮图片:
    • Assets添加图片,如:名称为 fanhui
    • 在自定义的ViewController中实现
    • self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "fanhui")
    • self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "fanhui")
  • 去除返回图片右侧文字,处理iOS14后的返回按钮长按场景
    • let backBarButton = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    • if #available(iOS 14, *) {
      • self.navigationItem.backButtonDisplayMode = .minimal
    • }else{
      • navigationItem.backBarButtonItem = backBarButton
    • }            
  • 若要全局处理以上问题,请在自定义基类中实现,以后再自定义ViewController时 继承 基类            
  • 在使用 透明导航栏 或者 渐变导航栏 时,需要设置edgesForExtendedLayout 属性,使自定义的ViewController填充到屏幕顶部,edgesForExtendedLayout属性具体使用请查看