xyz-log.
トップへ戻る
Tech / 2026.01.15 2026.01.15 / 4 分 ...

完全に理解する Storyboard & UIKit (Day 27): ダークモード対応とアセットカタログ

S7r1n9y

S7r1n9y

Engineer

完全に理解する Storyboard & UIKit
27 / 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 27): ダークモード対応とアセットカタログ

Sponsored

完全に理解する Storyboard & UIKit (Day 27): ダークモード対応とアセットカタログ

iOS 13でシステム全体を黒基調にする「ダークモード」が導入されました。現在では多くのユーザーがダークモードを常用しており、これに対応していないアプリは「眩しすぎる」「古臭い」という印象を与えてしまいます。

UIKitにおいては、コードを書かずに Asset Catalog (Assets.xcassets) を活用するだけで、驚くほど簡単に完全なダークモード対応(動的切り替え)を実現できます。


1. System Colors (動的カラー) を使う

iOSが標準で提供している色(System Colors)は、初めからライトモード/ダークモードに対応した動的(Dynamic)な色になっています。

StoryboardのAttributes Inspectorやコードで色を指定する際、「カスタムカラー(固定のRGB値)」を設定してしまうとダークモードでもその色のままになってしまいます。

  • ❌ 固定色: UIColor.whiteUIColor(red: 1, green: 1, blue: 1, alpha: 1) (常に真っ白)
  • ✅ 動的色: UIColor.systemBackground(ライト時は白、ダーク時は黒になる)
  • ✅ 動的色: UIColor.label(ライト時は黒、ダーク時は白になる標準テキスト色)

基本的には、背景には System Background Color、文字には Label Color(または Secondary Label Color)を指定していれば、自動的に完璧なダークモード対応が完了します。


2. 独自の色(ブランドカラー)をダークモード対応させる

自社のブランドカラー(例: プライマリーブルー)を使いたい場合、ライトモードでは良くても、ダークモードの黒背景だと見えづらくなったり、眩しすぎたりします。 この場合、Asset Catalog で「Color Set」を作成 し、「ライト用」と「ダーク用」の2つの色を1つの名前で登録します。

Color Set の作成手順

  1. プロジェクト内の Assets.xcassets を開きます。
  2. 左下の + ボタンを押し、Color Set を選択します。
  3. 作成されたカラーセット(色が入る四角が2つ出るはずです)の名前を BrandPrimary などに変更します。
  4. "Any Appearance" (ライトモード用) の四角を選択し、右側のAttributes InspectorでRGB値を指定します(例: 明るい青)。
  5. "Dark Appearance" (ダークモード用) の四角を選択し、RGB値を指定します(例: 少し明度を落とした落ち着いた青)。
    • ※もし四角が1つしかない場合は、Attributes Inspectorの Appearances 項目を Any, Dark に변경してください。

Color Set の使い方

  • Storyboardで: 色の選択プルダウンを開くと「Named Colors」という欄に先ほど作った BrandPrimary が登場しているので、これを選択します。
  • コードで: 以下のように名前指定で初期化します。
    swift
    myButton.backgroundColor = UIColor(named: "BrandPrimary")

これで、端末の設定がダークモードに切り替わった瞬間、アプリを再起動することなくシームレスに BrandPrimary が「明るい青」から「落ち着いた青」に変化します!


3. 画像もダークモードで切り替える

色だけでなく、「ロゴ画像」や「アイコン」もダークモード時には明るい画像に変えたい場合があります。 これも Color Set と同じ仕組み(Image Set)で簡単に実現できます。

  1. Assets.xcassets を開きます。
  2. 対象の画像アセット(Image Set)を選択します。
  3. 右側のAttributes Inspectorを開き、AppearancesAny, Dark に変更します。
  4. すると画像を入れるスロットが2つに増増えるので、「Any Appearance」に黒いロゴを、「Dark Appearance」に白いロゴをドラッグ&ドロップします。

これだけで、UIImageView はモードに応じて自動的に画像を差し替えてくれます。


4. 開発時のテストと固定化

シミュレータでダークモードを切り替える

シミュレータの上部メニュー Features > Toggle Appearance をクリックするか、キーボードショートカット ⇧⌘A (Shift + Cmd + A) を押すことで、一瞬でライト/ダークを切り替えてテストできます。

ダークモード対応を見送り、ライトモードに完全固定したい場合

予算や時間の都合でどうしてもダークモード対応が間に合わない場合、「強制的にライトモードで表示する」逃げ道があります。 プロジェクトの Info.plist を開き、以下のキーと値を追加します。

  • Key: User Interface Style (コード名: UIUserInterfaceStyle
  • Value: Light

これで、ユーザーが端末をダークモードにしていても、このアプリだけは常にライトモードで表示されます(ただしAppleは非推奨としており、最終手段に留めるべきです)。


📝 今日のまとめ

  • SwiftUIへの移行が進む中でも、仕組みは共通。ダークモード対応の基本は固定のRGB値や UIColor.white ではなく、動的な Semantic Color(systemBackgroundlabel)を使うこと
  • 独自の色は、Assets.xcassets 内で Color Set を作成し、ライトとダークの2色を登録して使用する。
  • 画像自体もアセットカタログの Appearances 属性を変更 することで、モードによって画像を出し分けることができる。

これで、現代のアプリとしてユーザーから求められる当たり前の配慮(ダークモード)を満たしました。 明日の Day 28 では、さらに一歩進んだ「誰にでも使えるアプリ」を目指すためのUI設計、Accessibility(VoiceOver対応など) の実装基礎を学びます。

END OF FILE
この記事は役に立ちましたか?
SNSでシェアする
後で読む(ブックマーク)
完全に理解する Storyboard & UIKit
27 / 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