SwiftyNavigationBar 5.1.2

SwiftyNavigationBar 5.1.2

wlgemini 维护。



  • 作者
  • wlgemini

SwiftyNavigationBar

SwiftyNavigationBar CI Version License Platform

自定义 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方法内部接管了UINavigationControllerdelegate,请勿重新设置delegate。如果需要,可以通过nav.snb.navigationControllerDelegate来设置delegate。

接下来,你只需要在UIViewControllerviewDidLoad()方法或更早的方法中做一些配置即可,这些配置项都以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三种

    backgroundEffect

  • backgroundAlpha:更改背景透明度(并不是改变NavigationBar的透明度)

    backgroundAlpha

  • tintColor:更改NavigationBartintColor,主要影响左右两侧的BarButtonItem颜色

    tintColor

  • isWhiteBarStyle:更改NavigationBarbarStyle,主要影响StatusBartitle的颜色

    isWhiteBarStyle

  • shadowImageAlpha:更改shadowImage的透明度

    shadowImageAlpha

  • alpha:更改NavigationBar的透明度(这将使整个NavigationBar被隐藏)

    alpha

样式的综合使用

  • 🌰#1

    use1

  • 🌰#2

    use2

推荐用法

你不需要在每个UIViewControllerviewDidLoad()方法中都进行相应的样式配置。

实际上,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 文件。