從 Interface Builder & 程式設定 UIKit navigation bar & tab bar 的樣式
從 iOS 13 開始,navigation bar & tab bar 的樣式可透過各種 appearance 設定,比方 scrollEdgeAppearance,standardAppearance,compactScrollEdgeAppearance & compactAppearance。相關的說明可參考以下連結。
接下來我們將示範如何從 Interface Builder & 程式設定 scrollEdgeAppearance,修改 navigation bar & tab bar 的樣式。
ps:
- Xcode 13 以上的版本才可以從 Interface Builder 設定 appearance。
- App 的頁面會依據不同情況採用 scrollEdgeAppearance,standardAppearance,compactScrollEdgeAppearance 或 compactAppearance 的設定。若希望 App 在任何情況都顯示一樣樣式的 navigation bar, 請將 scrollEdgeAppearance & standardAppearance 設成一樣的樣式。
navigation bar 樣式
設定某個 navigation bar 的樣式
- Interface Builder
點選 navigation controller 下的 navigation bar ,勾選 Scroll Edge。
- 程式
從 navigation controller 讀取 navigationBar,然後設定它的 scrollEdgeAppearance。
let barAppearance = UINavigationBarAppearance()
navigationController?.navigationBar.scrollEdgeAppearance = barAppearance
App 的 navigation bar 套用同一個樣式
設定 UINavigationBar.appearance() 的 scrollEdgeAppearance。
let barAppearance = UINavigationBarAppearance()
UINavigationBar.appearance().scrollEdgeAppearance = barAppearance
接下來的例子,在程式的範例部分,我們將以 App 的 navigation bar 套用同一個樣式說明。
透明的 navigation bar
- Interface Builder
在不捲動的畫面,不勾選 Scroll Edge 將變成透明的 navigation bar。
- 程式
呼叫 configureWithTransparentBackground。
let barAppearance = UINavigationBarAppearance()
barAppearance.configureWithTransparentBackground()
UINavigationBar.appearance().scrollEdgeAppearance = barAppearance
毛玻璃的 navigation bar
- Interface Builder
在不捲動的畫面,勾選 Scroll Edge 將變成毛玻璃的 navigation bar。
- 程式
呼叫 configureWithDefaultBackground。
let barAppearance = UINavigationBarAppearance()
barAppearance.configureWithDefaultBackground()
UINavigationBar.appearance().scrollEdgeAppearance = barAppearance
毛玻璃的模糊效果
- Interface Builder
設定 Scroll Edge Appearance 的 Blur Style。
- 程式
設定 backgroundEffect。
let barAppearance = UINavigationBarAppearance()
barAppearance.configureWithDefaultBackground()
barAppearance.backgroundEffect = UIBlurEffect(style: .systemMaterialDark)
UINavigationBar.appearance().scrollEdgeAppearance = barAppearance
navigation bar 的背景顏色
- Interface Builder
設定 Scroll Edge Appearance 的 Background。
- 程式
設定 backgroundColor。
let barAppearance = UINavigationBarAppearance()
barAppearance.backgroundColor = .blue
UINavigationBar.appearance().scrollEdgeAppearance = barAppearance
navigation bar 的背景圖片
- Interface Builder
設定 Scroll Edge Appearance 的 Image。
- 程式
設定 backgroundImage。預設的 content mode 為 scaleToFill,可透過 backgroundImageContentMode 修改 。
let barAppearance = UINavigationBarAppearance()
barAppearance.backgroundImage = UIImage(named: "pattern")
UINavigationBar.appearance().scrollEdgeAppearance = barAppearance
navigation bar 下方的的 shadow 顏色
- Interface Builder
設定 Scroll Edge Appearance 的 Shadow Color。
- 程式
設定 shadowColor 為紅色。
let barAppearance = UINavigationBarAppearance()
barAppearance.configureWithDefaultBackground()
barAppearance.shadowColor = .red
UINavigationBar.appearance().scrollEdgeAppearance = barAppearance
設定 navigation bar 下方無陰影。
- Interface Builder
設定 Scroll Edge Appearance 的 Shadow Color 為 Clear Color。
- 程式
let barAppearance = UINavigationBarAppearance()
barAppearance.configureWithDefaultBackground()
barAppearance.shadowColor = nil
UINavigationBar.appearance().scrollEdgeAppearance = barAppearance
標題的位置
- Interface Builder
Scroll Edge Appearance 的 Title Offset 選擇 Custom Offset。
- 程式
設定 titlePositionAdjustment。
let barAppearance = UINavigationBarAppearance()
barAppearance.configureWithDefaultBackground()
barAppearance.titlePositionAdjustment = UIOffset(horizontal: -100, vertical: 10)
UINavigationBar.appearance().scrollEdgeAppearance = barAppearance
navigation bar 的標題樣式
- Interface Builder
Scroll Edge Text Attributes 的 Title 選擇 Custom。
- 程式
設定 titleTextAttributes 或 largeTitleTextAttributes。
let barAppearance = UINavigationBarAppearance()
barAppearance.configureWithDefaultBackground()
barAppearance.backgroundEffect = UIBlurEffect(style: .systemMaterialDark)
barAppearance.titleTextAttributes = [
.foregroundColor: UIColor.white,
.font: UIFont.systemFont(ofSize: 50)
]
UINavigationBar.appearance().scrollEdgeAppearance = barAppearance
navigation bar 上 button 的文字樣式
- Interface Builder
Scroll Edge Bar Button Appearances 的 Button 選擇 Custom。
除了一般的 Button 可設定外,也可設定 Done Button & Back Button。
- 程式
可設定 buttonAppearance,backButtonAppearance & doneButtonAppearance ,型別為 UIBarButtonItemAppearance。
let barAppearance = UINavigationBarAppearance()
barAppearance.configureWithDefaultBackground()
let buttonAppearance = UIBarButtonItemAppearance()
buttonAppearance.normal.titleTextAttributes = [
.foregroundColor: UIColor.orange
]
barAppearance.buttonAppearance = buttonAppearance
UINavigationBar.appearance().scrollEdgeAppearance = barAppearance
navigation bar 的 button 圖文顏色
- Interface Builder
從 Bar Button Item 或 Navigation Bar 設定 Tint。
- 程式
設定 UIBarButtonItem.appearance() 的 tintColor。
UIBarButtonItem.appearance().tintColor = .orange
ps: 若有另外用 UIBarButtonItemAppearance 設定 button item 的樣式,button 的文字將依據 UIBarButtonItemAppearance 的設定。
navigation bar 的 back 按鈕設定
舊版 Navigation Bar 的設定方法(Xcode 12 以前)
tab bar 樣式
設定 bar 背景樣式的方法跟 navigation bar 類似,因此以下我們主要說明如何調整 tab 的圖文樣式。
tab 的 icon 顏色
依據 normal & selected 狀態設定不同的 iconColor,normal 是未被選取的 tab,selected 是被選取的 tab。
let barAppearance = UITabBarAppearance()
barAppearance.configureWithDefaultBackground()
barAppearance.stackedLayoutAppearance.normal.iconColor = .gray barAppearance.stackedLayoutAppearance.selected.iconColor = .orange
UITabBar.appearance().scrollEdgeAppearance = barAppearance
tab 顯示時有 stackedLayoutAppearance,inlineLayoutAppearance & compactInlineLayoutAppearance 三種模式。
- stackedLayoutAppearance : 圖在上,字在下。
- inlineLayoutAppearance : 圖在左,字在右。
- compactInlineLayoutAppearance : 圖在左,字在右,針對較小的 iPhone。
剛剛的範例畫面為 portrait 的 iPhone,它將採用 stackedLayoutAppearance。若想在 landscape 的 iPhone 12 設定 icon 顏色,則要另外設定 compactInlineLayoutAppearance。
barAppearance.compactInlineLayoutAppearance.normal.iconColor = .gray
barAppearance.compactInlineLayoutAppearance.selected.iconColor = .orange
ps: 剛剛的範例設定 scrollEdgeAppearance,不過畫面若是捲動畫面,則要另外設定 standardAppearance,相關說明可參考以下連結。
tab 的 文字樣式
設定 titleTextAttributes。
let barAppearance = UITabBarAppearance()
barAppearance.configureWithDefaultBackground()
barAppearance.stackedLayoutAppearance.normal.iconColor = .gray barAppearance.stackedLayoutAppearance.normal.titleTextAttributes = [
.foregroundColor: UIColor.gray,
.font: UIFont.systemFont(ofSize: 20)
]
barAppearance.stackedLayoutAppearance.selected.iconColor = .orange barAppearance.stackedLayoutAppearance.selected.titleTextAttributes = [
.foregroundColor: UIColor.orange,
.font: UIFont.systemFont(ofSize: 20)
]
UITabBar.appearance().scrollEdgeAppearance = barAppearance
另一種設定 tab 圖文顏色的方法
- Interface Builder
設定 Tab Bar 的 Image Tint。
- 程式
設定 UITabBar.appearance() 的 tintColor。
UITabBar.appearance().tintColor = .orange
ps: 若有另外從 stackedLayoutAppearance,inlineLayoutAppearance & compactInlineLayoutAppearance 設定文字樣式,文字將依據它們的設定。