實現透明的 navigation bar & tab bar — 利用它的背景圖和陰影圖

iOS App 的上方,時常會看到一條毛玻璃的 navigation bar,不過偶爾我們會看到類似上圖這樣完全透明的 navigation bar。接下來就讓我們一步步實現透明的 navigation bar 吧。

新方法: iOS 13 客製 bar 模樣的 UINavigationBarAppearance

舊方法: iOS 13 以前的版本

1 在 storyboard 設計搭配 navigation controller 的畫面。

App 啟動後,預設將看到毛玻璃的 navigation bar。

2 在 navigation controller 顯示的第一個 controller 裡將 navigation bar 變透明。

override func viewDidLoad() {   super.viewDidLoad()   let image = UIImage() 
self.navigationController?.navigationBar.setBackgroundImage(image, for: .default)
}

利用 setBackgroundImage(_:for:) 將 bar 的背景圖片設成 UIImage( ),即可讓 bar 變透明,因為 UIImage( ) 是個看不到的圖片。

結果將如上圖所示,bar 變透明了 ! 因此,利用這個技巧,除了將 bar 變透明,我們還可讓它顯示特別的背景圖片,比方波浪狀的彩虹。

let image = UIImage(named: "rainbowLine")self.navigationController?.navigationBar.setBackgroundImage(image, for: .default)

but,我們最害怕聽到 but 了,剛剛透明的 bar 的下方還殘留一條細細的分隔線。

這條線其實是 navigation bar 的 shadow 圖片,所以只要我們將它的 shadowImage 設成看不到的 UIImage(),就可消除這條礙眼的細線。

override func viewDidLoad() {   super.viewDidLoad()   let image = UIImage() 
self.navigationController?.navigationBar.setBackgroundImage(image, for: .default)
self.navigationController?.navigationBar.shadowImage = image}

透過 shadowImage,我們甚至可在 bar 的下方加入特別的分隔線,比方以下例子。

self.navigationController?.navigationBar.shadowImage = UIImage(named: "rainbowLine")

值得注意的,若要實現透明的 navigation bar,記得它的 isTranslucent 必須為 true,否則將無法透明。

self.navigationController?.navigationBar.isTranslucent = true

在剛剛的例子,因為我們搭配 storyboard 上拉出的 navigation controller,它的 navigation bar 預設即勾選 Translucent,因此不用再另外設定。

若想將 App 所有的 UINavigationBar 變透明,則可透過 UINavigationBar.appearance( ) 實現,比方以下例子,我們在 App 啟動時將 bar 變透明。

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {   let image = UIImage()   UINavigationBar.appearance().setBackgroundImage(image, for: .default)   UINavigationBar.appearance().shadowImage = image   return true}

若想 App 所有的 UITabBar 變透明,方法差不多,一樣是將 backgroundImage & shadowImage 設為 UIImage()。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {   let image = UIImage()   UITabBar.appearance().backgroundImage = image   UITabBar.appearance().shadowImage = image   return true}

--

--

彼得潘的 iOS App Neverland
彼得潘的 Swift iOS App 開發問題解答集

彼得潘的iOS App程式設計入門,文組生的iOS App程式設計入門講師,彼得潘的 Swift 程式設計入門,App程式設計入門作者,http://apppeterpan.strikingly.com