类似微信一样的导航栏
- 支持设置导航栏背景颜色
- 支持设置导航栏背景图片
- 支持Large Title模式
- 支持iOS 13 暗黑模式
- 支持全屏手势返回
- 同使用UINavigationBar一样简单
- iOS 9.0+
- Xcode 11.0+
- Swift 5.0+
WXNavigationBar
可以通过CocoaPods安装,在Podfile
中添加
use_frameworks!
pod 'WXNavigationBar', '~> 2.3.6'
WXNavigationBar
也可以通过Carthage进行安装,你可以添加如下代码到 Cartfile中:
github alexiscn/WXNavigationBar
dependencies: [
.package(url: "https://github.com/alexiscn/WXNavigationBar.git", .upToNextMajor(from: "2.3.6"))
]
WXNavigationBar
通过将系统导航栏设为透明,在View中添加一个NavigationBar相同大小,相同位置的View作为假的导航栏。
原始的UINavigationBar
还是用于处理手势相关逻辑,WXNavigationBar
用于展示部分,比如背景颜色、背景图片等。
所以你可以像平常使用UINavigationBar
一样,当你需要处理导航栏显示的时候,使用WXNavigationBar
。
在AppDelegate.swift
中配置:
import WXNavigationBar
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// ...
WXNavigationBar.setup()
}
使用WXNavigationBar
不需要特殊的初始化配置,默认的就如同微信中的导航栏一样。当你需要配置时,有两种方式可以配置。使用WXNavigationBar.NavBar
中的属性对UINavigationController
进行配置,该配置对所有的ViewController都生效,或者重写UIViewController
中的相关属性对UIViewController
进行配置。
在AppDelegate.swift
中全局配置
import WXNavigationBar
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// ...
// configure WXNavigationBar
// WXNavigationBar.NavBar.backImage = UIImage(named: "xxx")
}
有如下的这些配置选项:
/// 导航栏返回按钮
public static var backImage: UIImage? = Utility.backImage
/// 自定义视图定制导航栏返回按钮
public static var backButtonCustomView: UIView? = nil
/// 导航栏背景图片
public static var backgroundImage: UIImage? = nil
/// 导航栏背景颜色
public static var backgroundColor: UIColor = UIColor(white: 237.0/255, alpha: 1.0)
/// 导航栏的tintColor
public static var tintColor = UIColor(white: 24.0/255, alpha: 1.0)
/// 导航栏底部阴影图片
public static var shadowImage: UIImage? = UIImage()
/// 是否启用全屏左滑手势
public static var fullscreenPopGestureEnabled = false
你也可以通过重写 WXNavigationBar
支持的属性对制定的ViewController进行配置。
你可以通过如下属性设置导航栏的背景颜色
/// Background color of fake NavigationBar
/// Default color is UIColor(white: 237.0/255, alpha: 1.0)
override var wx_navigationBarBackgroundColor: UIColor? {
return .white
}
你可以配置导航栏的背景图片:
override var wx_navigationBarBackgroundImage: UIImage? {
return UIImage(named: "icons_navigation_bar")
}
当你需要使用系统样式得导航栏时,可以将 wx_useSystemBlurNavBar
设为true
:
override var wx_useSystemBlurNavBar: Bool {
return true
}
override var wx_barBarTintColor: UIColor? {
return .red
}
override var wx_barTintColor: UIColor? {
return .black
}
你可以设置导航栏底部黑线图片,比如是纯色的图片,或是渐变的图片。
override var wx_shadowImage: UIImage? {
return UIImage(named: "icons_navigation_bar_shadow_line")
}
为了方便起见,可以使用wx_shadowImageTintColor
来指定导航栏底部黑线的颜色,如果使用了wx_shadowImageTintColor
,则wx_shadowImage
会被忽略。
override var wx_shadowImageTintColor: UIColor? {
return .red
}
你可以给特定的ViewController设置特定的返回按钮图片:
override var wx_backImage: UIImage? {
return UIImage(named: "icons_view_controller_back_image")
}
你可以创建自定义视图来设定自定义返回按钮:
override var wx_backButtonCustomView: UIView? {
let label = UILabel()
label.text = "back"
label.textAlignment = .center
return label
}
你可以在特定的ViewController中禁用手势返回:
override var wx_disableInteractivePopGesture: Bool {
return true
}
你可以在特定的ViewController启用全屏手势返回。默认是整个页面都会响应手势返回,通过wx_interactivePopMaxAllowedDistanceToLeftEdge
修改距离页面边缘的距离。
override var wx_fullScreenInteractivePopEnabled: Bool {
return true
}
override wx_interactivePopMaxAllowedDistanceToLeftEdge: CGFloat {
return view.bounds.width * 0.5
}
这里列出了WXNavigationBar
的一些高级用法:
有多种方式可以设置导航栏透明:
wx_navigationBar.alpha = 0
wx_navigationBar.isHidden = true
override var wx_navigationBarBackgroundColor: UIColor? {
return .clear
}
参考 MomentViewController
wx_navigationBar
是UIView
的子类,所以你可以对其做任何可以对UIView
的逻辑。比如增加渐变的GradientLayer
,比如增加导航栏动画等等。
如果你需要在用户点击返回按钮的时候处理一些逻辑,你可以重写ViewController的wx_backButtonClicked
方法。比如,你可以在用户点击返回按钮的时候弹出一个Alert:
override func wx_backButtonClicked() {
let alert = UIAlertController(title: "Are you sure to exit", message: nil, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { [weak self] _ in
self?.navigationController?.popViewController(animated: true)
}))
alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { _ in
}))
present(alert, animated: true, completion: nil)
}
当动态添加Child View Controller时,wx_navigationBar
可能被遮盖,所以你你需要手动将其移到最前面
// addChild(controller) or addSubview
view.bringSubviewToFront(wx_navigationBar)
WXNavigationBar
基于MTI协议。LICENSE