SwiftyNavigationBar
自定义 NavigationBar 的一种简单方法。
需求
- iOS 8.0+
- Swift 5.0
安装
CocoaPods
SwiftyNavigationBar 通过 CocoaPods 提供使用。要安装它,请简单地向您的 Podfile 中添加以下行:
pod 'SwiftyNavigationBar'
Swift Package Manager
从 Xcode 11 开始,您可以使用 Swift Package Manager 将 SwiftyNavigationBar 添加到您的项目中。
dependencies: [
.package(url: "https://github.com/wlgemini/SwiftyNavigationBar.git", .upToNextMajor(from: "5.1.0"))
]
快速入门
首先,你需要使用以下extension
中的任意一个init
方法来初始化UINavigationController
// 1
init(preference: ((Style) -> Void)?)
// 2
init(rootViewController: UIViewController, preference: ((Style) -> Void)?)
// 3
init(viewControllers: [UIViewController], preference: ((Style) -> Void)?)
// 4
init(viewControllers: [UIViewController], toolbarClass: AnyClass?, preference: ((Style) -> Void)?)
let nav = UINavigationController(rootViewController: ViewController(), preference: nil)
⚠️ 注意,以上init
方法内部接管了UINavigationController
的delegate
,请勿重新设置delegate。如果需要,可以通过nav.snb.navigationControllerDelegate
来设置delegate。
接下来,你只需要在UIViewController
的viewDidLoad()
方法或更早的方法中做一些配置即可,这些配置项都以snb
为前缀:
override func viewDidLoad() {
super.viewDidLoad()
self.snb.style.backgroundEffect = .color(.red)
self.snb.style.backgroundAlpha = 0.5
...
}
当你想更新当前NavigationBar
的样式时,需要调用snb.updateStyle()
方法:
self.snb.updateStyle { (style) in
style.isWhiteBarStyle = true
style.shadowImageAlpha = 0.5
}
⚠️ 这里需要注意的是,snb.updateStyle()
仅作用于UINavigationController.topViewController
,你当前的ViewController
在栈顶时才会起作用。
样式
具体来说,可以配置以下样式(PS:这些GIF图中的样式都是通过snb.updateStyle()
方法更新的):
-
backgroundEffect
:更改背景样式,可选类别有Blur
/Image
/Color
三种 -
backgroundAlpha
:更改背景透明度(并不是改变NavigationBar
的透明度) -
tintColor
:更改NavigationBar
的tintColor
,主要影响左右两侧的BarButtonItem
颜色 -
isWhiteBarStyle
:更改NavigationBar
的barStyle
,主要影响StatusBar
和title
的颜色 -
shadowImageAlpha
:更改shadowImage
的透明度 -
alpha
:更改NavigationBar
的透明度(这将使整个NavigationBar
被隐藏)
样式的综合使用
推荐用法
你不需要在每个UIViewController
的viewDidLoad()
方法中都进行相应的样式配置。
实际上,SwiftyNavigationBar提供了3种样式配置的作用域,选择合适的作用域会让配置更便捷:
-
UIViewController
作用域:在ViewController
中,以snb.style
开头的相关属性配置,它只会影响当前ViewController
的样式override func viewDidLoad() { ... self.snb.style.backgroundAlpha = /* alpha */ ... }
-
UINavigationController
作用域:作用于UINavigationController
中的所有viewController
let nav = UINavigationController(rootViewController: ViewController(), preference: { (style) in // 样式配置 style.backgroundEffect = /* effect */ ... })
-
全局
作用域:作用于所有通过相关init
方法初始化的UINavigationController
。SwiftyNavigationBar.Style.backgroundEffect = /* effect */ SwiftyNavigationBar.Style.tintColor = /* tintColor */ SwiftyNavigationBar.Style.alpha = /* alpha */
它们的优先级是:UIViewController
作用域 > UINavigationController
作用域 > 全局
作用域
其中全局
作用域有默认值,也就是说,UINavigationController
作用域/UIViewController
作用域可以不配置或只配置一部分样式,剩下的样式配置使用全局
作用域的配置即可。
因此,一个推荐的用法如下:
// 第一步,配置Global作用域
SwiftyNavigationBar.Style.backgroundEffect = /* effect */
// 第二步,配置UINavigationController作用域
let nav1 = UINavigationController(rootViewController: ViewController(), preference: { (style) in
style.backgroundEffect = /* effect */
style.tintColor = /* tintColor */
})
let nav2 = UINavigationController(rootViewController: ViewController(), preference: nil)
nav2.snb.navigationControllerDelegate = self /* 等价于nav.delegate = self */
// 第三步,配置UIViewController作用域
override func viewDidLoad() {
...
self.snb.style.backgroundAlpha = /* alpha */
...
}
作者
wlgemini, [email protected]
许可证
SwiftyNavigationBar 以 MIT 许可证提供。有关更多信息,请参阅 LICENSE 文件。