- 基于swift5实现,也适用于OC ,demo中有简单的使用示例
- 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
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属性具体使用请查看