xyz-log.
トップへ戻る
Tech / 2026.01.14 2026.01.14 / 3 分 ...

完全に理解する Storyboard & UIKit (Day 26): UIAppearanceによるアプリ全体の色・スタイル管理

S7r1n9y

S7r1n9y

Engineer

完全に理解する Storyboard & UIKit
26 / 30
このシリーズの記事一覧
  1. 1. 完全に理解する Storyboard & UIKit (Day 1): 基礎概念と歴史
  2. 2. 完全に理解する Storyboard & UIKit (Day 2): XcodeでのStoryboardの基本操作
  3. 3. 完全に理解する Storyboard & UIKit (Day 3): UIViewControllerのライフサイクル
  4. 4. 完全に理解する Storyboard & UIKit (Day 4): Auto Layoutの基本原理
  5. 5. 完全に理解する Storyboard & UIKit (Day 5): Auto Layoutの複雑な制約の解決
  6. 6. 完全に理解する Storyboard & UIKit (Day 6): UIStackViewを使った効率的なレイアウト設計
  7. 7. 完全に理解する Storyboard & UIKit (Day 7): Size Classesによるレスポンシブデザイン
  8. 8. 完全に理解する Storyboard & UIKit (Day 8): Segueによる画面遷移とデータ渡し
  9. 9. 完全に理解する Storyboard & UIKit (Day 9): Navigation Controllerの活用
  10. 10. 完全に理解する Storyboard & UIKit (Day 10): Tab Bar Controllerの活用
  11. 11. 完全に理解する Storyboard & UIKit (Day 11): 基本的なUI部品(UILabel, UIButton, UITextField)
  12. 12. 完全に理解する Storyboard & UIKit (Day 12): UITextViewとキーボードハンドリング
  13. 13. 完全に理解する Storyboard & UIKit (Day 13): UIImageViewと画像リソース管理
  14. 14. 完全に理解する Storyboard & UIKit (Day 14): UIScrollViewとコンテンツのスクロール
  15. 15. 完全に理解する Storyboard & UIKit (Day 15): UITableViewの実装基礎
  16. 16. 完全に理解する Storyboard & UIKit (Day 16): UITableViewのカスタムセル作成
  17. 17. 完全に理解する Storyboard & UIKit (Day 17): UICollectionViewの実装基礎
  18. 18. 完全に理解する Storyboard & UIKit (Day 18): UICollectionViewのカスタムレイアウト
  19. 19. 完全に理解する Storyboard & UIKit (Day 19): Custom Viewの作成とStoryboardでの利用(@IBDesignable, @IBInspectable)
  20. 20. 完全に理解する Storyboard & UIKit (Day 20): アニメーションの実装(UIView Animation)
  21. 21. 完全に理解する Storyboard & UIKit (Day 21): Gesture Recognizerによるタッチ処理
  22. 22. 完全に理解する Storyboard & UIKit (Day 22): UIAlertControllerによるアラートとアクションシート
  23. 23. 完全に理解する Storyboard & UIKit (Day 23): UIDatePickerやUIPickerViewの実装
  24. 24. 完全に理解する Storyboard & UIKit (Day 24): Storyboard Referenceを用いたStoryboard分割
  25. 25. 完全に理解する Storyboard & UIKit (Day 25): XIBとStoryboardの使い分け・併用
  26. 26. 完全に理解する Storyboard & UIKit (Day 26): UIAppearanceによるアプリ全体の色・スタイル管理
  27. 27. 完全に理解する Storyboard & UIKit (Day 27): ダークモード対応とアセットカタログ
  28. 28. 完全に理解する Storyboard & UIKit (Day 28): Accessibility(VoiceOver対応など)のUI設計
  29. 29. 完全に理解する Storyboard & UIKit (Day 29): UIKitからSwiftUIへの移行 / UIKitでのSwiftUI利用
  30. 30. 完全に理解する Storyboard & UIKit (Day 30): 実践:1つのアプリをStoryboardとUIKitで完成させる
完全に理解する Storyboard & UIKit (Day 26): UIAppearanceによるアプリ全体の色・スタイル管理

Sponsored

完全に理解する Storyboard & UIKit (Day 26): UIAppearanceによるアプリ全体の色・スタイル管理

アプリを作っていると、「全ての画面のナビゲーションバーの色を自社ブランドのロゴ色に統一したい」といった要望が必ず出ます。 これを実現するために、Storyboardで10個のNavigationBarを一つ一つポチポチ設定したり、全てのViewControllerの viewDidLoadself.navigationController?.navigationBar.barTintColor = ... と書いて回るのは、非常に非効率でバグの温床になります。

UIKitには、こういった アプリ全体のUIコンポーネントのデフォルトスタイルを一括指定する ための強力な仕組み、UIAppearance プロトコルが用意されています。


1. UIAppearance とは?

UIAppearance は、特定のUIコンポーネント(UINavigationBar, UITabBar, UIButton, UILabelなど)に対して、「これから生成される全てのインスタンスに適用されるデフォルトの見た目」 を設定(プロキシ(代理)オブジェクトを通じて代入)するプロトコルです。

設定は通常、アプリ起動直後の起点である AppDelegate.swiftapplication(_:didFinishLaunchingWithOptions:) 内に記述します。


2. UINavigationBar の全体設定(iOS 13+ / iOS 15以降対応)

iOS 15以降、ナビゲーションバーやタブバーの見た目の管理は UINavigationBarAppearance 等の専用クラスを使う厳密なものになりました。これを UIAppearance を通じて全体に適用します。

swift
// AppDelegate.swift 内 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 1. Appearanceオブジェクトの作成 let navBarAppearance = UINavigationBarAppearance() // 背景を不透明な自社ブランドカラー(例:濃い青)で塗りつぶす navBarAppearance.configureWithOpaqueBackground() navBarAppearance.backgroundColor = UIColor(red: 0.1, green: 0.2, blue: 0.4, alpha: 1.0) // タイトルの文字色とフォントを設定(白文字、太字) navBarAppearance.titleTextAttributes = [ .foregroundColor: UIColor.white, .font: UIFont.boldSystemFont(ofSize: 18) ] // 戻るボタン等のアイテムの色 UINavigationBar.appearance().tintColor = UIColor.white // 2. 作成した設定を、アプリ全体(appearance)の通常時とスクロール時に適用する UINavigationBar.appearance().standardAppearance = navBarAppearance UINavigationBar.appearance().scrollEdgeAppearance = navBarAppearance return true }

このコードを書いておくだけで、Storyboardやコードで一切色を指定しなくても、アプリ内の全てのナビゲーションバーが自動的にこの青色と白文字になります


3. その他のUI部品の全体設定

ナビゲーションバー以外にも、あらゆる UIView のサブクラスに一括設定が可能です。

UITabBar (画面下部のタブ)

swift
let tabBarAppearance = UITabBarAppearance() tabBarAppearance.configureWithOpaqueBackground() tabBarAppearance.backgroundColor = .systemGray6 UITabBar.appearance().standardAppearance = tabBarAppearance // iOS 15以降は必須 UITabBar.appearance().scrollEdgeAppearance = tabBarAppearance // 未選択時と選択時のアイコン色の設定 UITabBar.appearance().tintColor = .systemBlue // 選択時 UITabBar.appearance().unselectedItemTintColor = .systemGray // 未選択時

UISwitch や UIActivityIndicatorView (くるくる)

swift
// スイッチがONの時の色を全てピンクにする UISwitch.appearance().onTintColor = .systemPink // くるくる回るインジケーターの色を一律でオレンジにする UIActivityIndicatorView.appearance().color = .systemOrange

4. 特定の下層にあるUIだけに適用する

「原則ベースの色を変えたいが、設定画面(SettingsViewController)の中にあるスイッチだけは別の色にしたい」というケースもあります。

appearance(whenContainedInInstancesOf:) を使うと、「特定の(親)クラスの中に配置されている場合のみ適用する」という柔軟な条件付けが可能です。

swift
// SettingsViewController の中にあるUISwitchだけは、緑色にする UISwitch.appearance(whenContainedInInstancesOf: [SettingsViewController.self]).onTintColor = .systemGreen

📝 今日のまとめ

  • アプリ全体で共有する色やフォントは、AppDelegate 上で UIAppearance を使って一括設定 するのがベストプラクティス。
  • NavigationBar や TabBar には専用の Appearance クラス(UINavigationBarAppearance 等)が存在する。
  • ClassName.appearance() に対してプロパティを設定することで、アプリ内全ての該当部品のデフォルト値が上書きされる。
  • whenContainedInInstancesOf: を使うことで、特定の親画面の中にいる時だけ適用するルールも作れる。

これで無駄なデザイン指定のコードやStoryboardのポチポチ作業から解放され、ブランドカラーの変更にも1分で対応できるようになりました。 明日の Day 27 では、近年のiOSアプリにおいて必須対応とも言える「ダークモード」への対応手法と、それを支える「Asset Catalog」の便利な使い方を学びます。

END OF FILE
この記事は役に立ちましたか?
SNSでシェアする
後で読む(ブックマーク)
完全に理解する Storyboard & UIKit
26 / 30
このシリーズの記事一覧
  1. 1. 完全に理解する Storyboard & UIKit (Day 1): 基礎概念と歴史
  2. 2. 完全に理解する Storyboard & UIKit (Day 2): XcodeでのStoryboardの基本操作
  3. 3. 完全に理解する Storyboard & UIKit (Day 3): UIViewControllerのライフサイクル
  4. 4. 完全に理解する Storyboard & UIKit (Day 4): Auto Layoutの基本原理
  5. 5. 完全に理解する Storyboard & UIKit (Day 5): Auto Layoutの複雑な制約の解決
  6. 6. 完全に理解する Storyboard & UIKit (Day 6): UIStackViewを使った効率的なレイアウト設計
  7. 7. 完全に理解する Storyboard & UIKit (Day 7): Size Classesによるレスポンシブデザイン
  8. 8. 完全に理解する Storyboard & UIKit (Day 8): Segueによる画面遷移とデータ渡し
  9. 9. 完全に理解する Storyboard & UIKit (Day 9): Navigation Controllerの活用
  10. 10. 完全に理解する Storyboard & UIKit (Day 10): Tab Bar Controllerの活用
  11. 11. 完全に理解する Storyboard & UIKit (Day 11): 基本的なUI部品(UILabel, UIButton, UITextField)
  12. 12. 完全に理解する Storyboard & UIKit (Day 12): UITextViewとキーボードハンドリング
  13. 13. 完全に理解する Storyboard & UIKit (Day 13): UIImageViewと画像リソース管理
  14. 14. 完全に理解する Storyboard & UIKit (Day 14): UIScrollViewとコンテンツのスクロール
  15. 15. 完全に理解する Storyboard & UIKit (Day 15): UITableViewの実装基礎
  16. 16. 完全に理解する Storyboard & UIKit (Day 16): UITableViewのカスタムセル作成
  17. 17. 完全に理解する Storyboard & UIKit (Day 17): UICollectionViewの実装基礎
  18. 18. 完全に理解する Storyboard & UIKit (Day 18): UICollectionViewのカスタムレイアウト
  19. 19. 完全に理解する Storyboard & UIKit (Day 19): Custom Viewの作成とStoryboardでの利用(@IBDesignable, @IBInspectable)
  20. 20. 完全に理解する Storyboard & UIKit (Day 20): アニメーションの実装(UIView Animation)
  21. 21. 完全に理解する Storyboard & UIKit (Day 21): Gesture Recognizerによるタッチ処理
  22. 22. 完全に理解する Storyboard & UIKit (Day 22): UIAlertControllerによるアラートとアクションシート
  23. 23. 完全に理解する Storyboard & UIKit (Day 23): UIDatePickerやUIPickerViewの実装
  24. 24. 完全に理解する Storyboard & UIKit (Day 24): Storyboard Referenceを用いたStoryboard分割
  25. 25. 完全に理解する Storyboard & UIKit (Day 25): XIBとStoryboardの使い分け・併用
  26. 26. 完全に理解する Storyboard & UIKit (Day 26): UIAppearanceによるアプリ全体の色・スタイル管理
  27. 27. 完全に理解する Storyboard & UIKit (Day 27): ダークモード対応とアセットカタログ
  28. 28. 完全に理解する Storyboard & UIKit (Day 28): Accessibility(VoiceOver対応など)のUI設計
  29. 29. 完全に理解する Storyboard & UIKit (Day 29): UIKitからSwiftUIへの移行 / UIKitでのSwiftUI利用
  30. 30. 完全に理解する Storyboard & UIKit (Day 30): 実践:1つのアプリをStoryboardとUIKitで完成させる
Related Articles