介紹
越來越多的應用程序在擁有全局導航欄樣式的同時,也要求每個視圖控制器自定義導航欄樣式。
YDRootNavigationController 這個項目就是幫助開發(fā)者以高效的方式解決這個問題,開發(fā)者以簡單的方式使用這個導航控制器,就像視圖控制器獨立設置狀態(tài)欄風格一樣,并且您可以為每個視圖控制器提供單獨的導航欄樣式,包括原生返回手勢、返回按鈕、狀態(tài)欄樣式、標簽欄顯示和隱藏狀態(tài)等等??梢圆榭催@篇 Swift YDRootNavigationController的實現(xiàn)原理 文章進行深入了解。

返回手勢與地圖.gif
概覽
- 支持設置全局統(tǒng)一默認的導航欄樣式(例如:導航欄背景顏色、底部分割線顏色、標題文字屬性),同時支持每個視圖控制器可以自定義導航欄樣式
- 支持全局默認設置是否開啟原生的返回手勢,同時支持視圖控制器自己默認設置和動態(tài)設置
- 支持全局默認設置是否開啟全屏返回手勢,同時支持視圖控制器自己默認設置和動態(tài)設置
- 支持全局默認設置是否隱藏返回按鈕,同時支持視圖控制器自己默認設置和動態(tài)設置
- 支持全局默認設置是否隱藏導航欄,同時支持視圖控制器自己默認設置和動態(tài)設置
- 支持全局默認設置是否隱藏標簽欄,同時支持視圖控制器自己默認設置和動態(tài)設置
- 支持設置狀態(tài)欄樣式和顯示隱藏狀態(tài)
- 支持定制返回按鈕樣式
- 支持自定義返回按鈕
- 支持自定義返回按鈕點擊事件
- 支持
Interface Builder
安裝
YDRootNavigationController 可通過 CocoaPods 獲得。安裝
只需將以下行添加到您的 Podfile 中:
pod 'YDRootNavigationController'
用法
一、全局默認樣式配置
1.創(chuàng)建一個類用來實現(xiàn)YDAppAppearanceProtocol協(xié)議
class MyAppAppearance: YDAppAppearanceProtocol {
var navigationBarBackgroundColor: UIColor? { .white }
var navigationBarBackgroundImage: UIImage? { UIImage.gradient(colors: [UIColor.red, UIColor.blue], type: .leftToRight, size: CGSize(width: Screen.width, height: Screen.navigationBarHeight))?.addCorner(YDRectCorner(bottomRight: 20))}
var navigationBarShadowColor: UIColor? { .red }
var titleTextAttributes: [NSAttributedString.Key : Any]? { [NSAttributedString.Key.foregroundColor: UIColor.blue] }
var backItemImage: UIImage? { UIImage(named: "nav_back_black_button") }
var backItemImageInsets: UIEdgeInsets? { UIEdgeInsets(top: 0, left: -6, bottom: 0, r[圖片上傳中...(導航欄背景顏色.gif-384156-1711033391835-0)]
ight: 0) }
}
這里用到的導航欄背景圖片是用代碼生成的,項目開發(fā)還是用UI切的圖片比較節(jié)約系統(tǒng)資源,需要注意的是,如果同時設置導航欄背景顏色和背景圖片,背景顏色將會被背景圖片覆蓋而失效。
2.在AppDelegate中調用
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// 全局默認樣式配置
MyAppAppearance().configure()
return true
}
}
二、視圖控制器自定義樣式配置
- 導航欄控制器設置為YDRootNavigationController或繼承YDRootNavigationController的類
- 代碼
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
self.window?.rootViewController = YDRootNavigationController()
return true
}
-
Interface Builder設置

IB設置YDRootNavigationController.gif
導航欄樣式配置
導航欄標題文字屬性
class ViewController: UIViewController {
override var navigationBarAppearence: YDNavigationBarAppearence {
YDNavigationBarAppearence(titleTextAttributes: [NSAttributedString.Key.foregroundColor: UIColor.randomColor, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 20)])
}
}

標題文字屬性.gif
導航欄背景顏色
class ViewController: UIViewController {
override var navigationBarAppearence: YDNavigationBarAppearence {
YDNavigationBarAppearence(backgroundColor: .randomColor)
}
}

導航欄背景顏色.gif
導航欄背景圖片
class ViewController: UIViewController {
override var navigationBarAppearence: YDNavigationBarAppearence { YDNavigationBarAppearence(backgroundImage: UIImage.gradient(colors: [UIColor.systemPink, UIColor.purple], type: .leftToRight, size: CGSize(width: Screen.width, height: Screen.navigationBarHeight))?.addCorner(YDRectCorner(bottomLeft: 20, bottomRight: 20))) }
}
這里用到的導航欄背景圖片是用代碼生成的,項目開發(fā)還是用UI切的圖片比較節(jié)約系統(tǒng)資源,需要注意的是,如果同時設置導航欄背景顏色和背景圖片,背景顏色將會被背景圖片覆蓋而失效。

導航欄背景圖片.gif
導航欄陰影顏色
class ViewController: UIViewController {
override var navigationBarAppearence: YDNavigationBarAppearence {
YDNavigationBarAppearence(shadowColor: .randomColor)
}
}

導航欄陰影.gif