![見出し画像](https://assets.st-note.com/production/uploads/images/101468480/rectangle_large_type_2_9f483c9d374bf43173d758db78cccecd.png?width=1200)
【徒然iOS】気ままにUIKit83〜NGサンプル Navigation Bar バーの色や背景画像をカスタマイズ〜
概要
このマガジンは四十を過ぎたおっさんが、
を参考にStoryboardでiOSアプリを完全に趣味で楽しんでいるだけな記事を気ままに上げてます。
今回
をハイ、レッツゴ🕺
前準備
念の為、
バックアップ
新しいクラス
ビューコントローラの追加
イニシャルビューの変更
をいつも通りやってから本題へ💃
![](https://assets.st-note.com/img/1680083198611-qhddnjuAQw.png?width=1200)
ここ数回、
ナビゲーションコントローラなのかナビゲーションアイテムなのか、ナビゲーションバーなのか結構、話が入り組んでるから驚く👀
前回が、ナビゲーションバーの設定とか言いながら、よくよく見ると、無ビゲーションアイテムの設定とか、ナビゲーションコントローラにクラスを適用したりと、錯綜してたけど💦
本題
今回はナビゲーションバーの設定みたいだから、
⒈ビューにナビゲーションバーをセットして、もうひとつのビューを追加して繋いどく
![](https://assets.st-note.com/img/1680083564262-fjLATQAVdR.png?width=1200)
![](https://assets.st-note.com/img/1680083702504-Jlbt7agRYG.png)
一覧表
![](https://assets.st-note.com/img/1680084356835-YHw3yIIbGI.png?width=1200)
ここは後は、実際に動かしながら遊びで確かめる方がいいので、一個一個は触れないけど。
と、3時間くらい、いろいろ悩んだんだけど、よくよくコードを見ると、結局、以下のコードって
ナビゲーションバーじゃなくって、ナビゲーションコントローラの設定じゃん!!!!!
説明少なすぎ👊
しかも、実行結果、バグってそうだし。
なので、試したコードと実行結果だけをサンプルで提示するに止めとく💦
⒉コード集
Shadow
![](https://assets.st-note.com/img/1680084648769-FABudKFoLq.png?width=1200)
![](https://assets.st-note.com/img/1680084660105-DaYb48S9Lt.png?width=1200)
class ShadowNavigationBarController: UINavigationController, UINavigationControllerDelegate {
//最初からあるメソッド
override func viewDidLoad() {
super.viewDidLoad()
//デリゲート先に自分を設定する。
self.delegate = self
}
//画面遷移後の呼び出しメソッド
func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
//ナビゲーションバーの背景画像を設定する。
self.navigationBar.setBackgroundImage(UIImage(named: "ナビゲーションバー背景"), for: .default)
//ナビゲーションバーのシャドウイメージを設定する。
self.navigationBar.shadowImage = UIImage(named: "ナビゲーションバーシャドウ")
}
}
実行結果
![](https://assets.st-note.com/img/1680089680393-yTUuCuUHKc.png?width=1200)
てな感じになって意味不明で混乱させるだけなんで💦
Back Mask
class ShadowNavigationBarController: UINavigationController, UINavigationControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
//デリゲート先に自分を設定する。
self.delegate = self
}
//画面遷移後の呼び出しメソッド
func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
//ナビゲーションバーのボタンの文字色を赤に変更する。
self.navigationBar.tintColor = UIColor.red
}
}
ナビゲーションバーが透明になるコード
class ShadowNavigationBarController: UINavigationController, UINavigationControllerDelegate {
//最初からあるメソッド
override func viewDidLoad() {
super.viewDidLoad()
//デリゲート先に自分を設定する。
self.delegate = self
}
//画面遷移後の呼び出しメソッド
func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
//ナビゲーションバーの背景画像を設定する。
self.navigationBar.setBackgroundImage(UIImage(), for: .default)
//ナビゲーションバーのシャドウイメージを設定する。
self.navigationBar.shadowImage = UIImage()
}
}
ナビゲーションバーのボタンの文字色を赤に変更コード
class ShadowNavigationBarController: UINavigationController, UINavigationControllerDelegate {
//最初からあるメソッド
override func viewDidLoad() {
super.viewDidLoad()
//デリゲート先に自分を設定する。
self.delegate = self
}
//画面遷移後の呼び出しメソッド
func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
//ナビゲーションバーのボタンの文字色を赤に変更する。
self.navigationBar.tintColor = UIColor.red
}
}
画像のレンダリングモードをAlwaysOriginalに変更するコード
class ShadowNavigationBarController: UINavigationController, UINavigationControllerDelegate {
//最初からあるメソッド
override func viewDidLoad() {
super.viewDidLoad()
//デリゲート先に自分を設定する。
self.delegate = self
}
//画面遷移後の呼び出しメソッド
func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
//戻るボタンの背景画像を設定する。
self.navigationBar.backIndicatorImage = UIImage(named: "back_button.png")?.withRenderingMode(UIImage.RenderingMode.alwaysOriginal)
self.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "back_button.png")?.withRenderingMode(UIImage.RenderingMode.alwaysOriginal)
}
}
画像未設定のUIImageインスタンスをボタンの画像に設定するコード
class ShadowNavigationBarController: UINavigationController, UINavigationControllerDelegate {
//最初からあるメソッド
override func viewDidLoad() {
super.viewDidLoad()
//デリゲート先に自分を設定する。
self.delegate = self
}
//画面遷移後の呼び出しメソッド
func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
//戻るボタンの背景画像を非表示にする。
self.navigationBar.backIndicatorImage = UIImage()
self.navigationBar.backIndicatorTransitionMaskImage = UIImage()
}
}
以上でサイト記事のコードは全部なんだけど。
GitHub上のファイルの中身を見てないからなんとも言えないが、
そもそもこれナビゲーションビューの話なのか?
最大の疑問。
![](https://assets.st-note.com/img/1680090724774-r4iYJdgJPJ.png?width=1200)
Navigation Barプロトコルを適用したコードではないので、
そもそもナビゲーションバーに適用できない💦
しかも、ナビゲーションコントローラに適用したところで、バグか変化しかないからね、、、🤔
今回の教訓
ま、自分が組んだコードでもないので、とやかく言う気はないのだが、
マニアックなコードとか、入り組んだコードを組んで、
独自
とか言うのは勝手なんだけど、開発環境自体が変わっていくから、
今回みたいに、改修の結果うまくいかない
ってことはザラにある。
コードを組むのがエンジニアの仕事
って思っている人も多いと思うけど、本体の仕事は、
長い目で見据えて、将来的にも改修に手間がかからない中で要求に見合うものを作るのが本来の仕事だからね〜〜〜🤔
記事のタイトルにナビゲーションバーの話と書いておきながら、ナビゲーションコントローラプロトコルを適用してなにがしたいのか意味不明でしかも動かないのであれば意味がないからね。
実際の現場でも、
自分の中でナビゲーションアイテムをナビゲーションバーと置き換えて、
ナビゲーションアイテムのつもりで、ナビゲーションバーと指示を出し、
結果、バーでは全然できないことを何時間も何日間も作らせておいて、
いざ、蓋を開けてみたら、自分の指示出しミスだったわ〜〜〜
ごめんごめん
みたいな人はよくいるからね〜〜〜
👉既存のattributeなんかを使って、
済ませる方が将来的なコスト削減につながる。
独特なコードは、将来のバグの原因と紙一重👀
さてと、次回は、
をレッツゴする🕺
この記事が気に入ったらサポートをしてみませんか?