上次客製化TabbarController,這次輪到UINavigationController
一言以蔽之,就是用iOS13後出的UINavigationBarAppearance
調整
這邊我覺得很容易想錯,standardAppearance是指滾動的時候,scrollEdgeAppearance反而才是一開始會看到的(因為預設是頂端)。
class MyNVC: UINavigationController {
override func viewDidLoad() {
super.viewDidLoad()
let appearance = UINavigationBarAppearance()
// 設定標題文字與大小
appearance.titleTextAttributes = [.foregroundColor: UIColor.white, .font: UIFont.systemFont(ofSize: 20.0, weight: .semibold)]
// 設定背景顏色
appearance.backgroundColor = .systemBlue
// 設定返回鍵normal狀態
let a = UIBarButtonItemAppearance()
let buttonItemAppearance = UIBarButtonItemAppearance()
let normal = buttonItemAppearance.normal
// 不顯示上一頁title(設成透明)
normal.titleTextAttributes = [.foregroundColor: UIColor.clear]
// 設定使用自己的圖片
normal.backgroundImage = UIImage(named: "back")
appearance.backButtonAppearance = buttonItemAppearance
navigationBar.standardAppearance = appearance
navigationBar.scrollEdgeAppearance = appearance
}
}
我的做法是先subclass一個NVC,並在viewdidload時去設定他的appearance。
// 會變一條實心的線
appearance.shadowColor = .gray
// 用圖的方式放上去
appearance.shadowImage = UIImage(named: "shadow")
StackOverFlow上也有人是用程式動態渲染出陰影圖片再放,或在navigationBar的layer上加,可是都比較麻煩,最好就是請設計單獨出一張陰影線的圖片XD
以前我們專案有另一種做法是去subclass VC,在viewdidLoad時把最左按鈕改成自定義的,缺點是會喪失掉原生的返回手勢,變成只能點擊按鈕返回,對使用者比較難用。
class MyVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let goBackBtn = UIBarButtonItem(image: UIImage(named: "back"), style: .plain, target: self, action: #selector(goBack))
self.navigationItem.leftBarButtonItem = goBackBtn
}
@objc func goBack() {
self.navigationController?.popViewController(animated: true)
}
}