Objective-Cでダークモードを無効にする10の簡単手順

Objective-Cコードサンプルと共にダークモードを無効にする方法を説明する画像Objctive-C
この記事は約18分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Objective-Cは、AppleのオペレーティングシステムであるmacOSやiOSで使用される主要なプログラミング言語の一つです。

1980年代に開発され、C言語にオブジェクト指向機能を加えたもので、Appleの開発環境では長年にわたり標準言語として採用されてきました。

Objective-CによるiOSアプリ開発では、デフォルトのユーザーインターフェースモードとして「ダークモード」が導入されていることがあります。

しかし、アプリケーションによってはこのダークモードが望ましくない場合もあります。

ここでは、Objective-Cを用いてiOSアプリでダークモードを無効にする方法について、具体的な手順を詳細に解説していきます。

●Objective-Cとは

Objective-Cは、Smalltalkのオブジェクト指向概念をC言語に取り入れたもので、その特性上、動的なランタイムを持つのが特徴です。

これにより、実行時にクラスやメソッドの情報を変更したり、新たな機能を追加することが可能です。

Objective-Cでは、メッセージ送信という形でメソッドが呼び出され、これにより他のオブジェクト指向言語と比較しても、柔軟なコーディングが可能になっています。

また、AppleはObjective-CをベースにSwiftという新しいプログラミング言語を開発し、現代のiOSアプリ開発ではSwiftが推奨されていますが、Objective-Cによる既存のコードベースやライブラリも多く、依然として重要な言語であるといえます。

○Objective-Cの基礎

Objective-Cの基本は、C言語の構文にオブジェクト指向の概念が追加されている点にあります。

クラスの宣言や実装、オブジェクトの生成といった基本的なオブジェクト指向の構文を学ぶことが、Objective-Cの世界への第一歩です。

Objective-Cでは、例えばクラスのインスタンスを生成する際には「alloc」メソッドを用いてメモリを割り当て、「init」メソッドで初期化を行います。

また、Objective-CにはARC(Automatic Reference Counting)というメモリ管理の仕組みがあり、オブジェクトの参照カウントをコンパイラが自動で管理してくれるため、開発者はメモリ管理を意識する必要が減りました。

これにより、以前よりもずっと簡単にメモリリークなどのバグを防ぐことができるようになっています。

●iOSのダークモードとは

iOSのダークモードは、ユーザーインターフェースのカラースキームを暗くすることで目の疲れを軽減し、暗い環境での視認性を高める機能です。

これは特に夜間や低照明環境での使用を想定しており、ユーザーがディスプレイから発せられる明るい光の量を減らせるように設計されています。

ダークモードは、iOS 13以降のバージョンで利用可能となり、アプリケーション開発者はこのモードをサポートするようAPIを利用してアプリケーションの外観を調整することが期待されます。

○ダークモードの基本

ダークモードは、システム全体に影響を及ぼし、サポートされているすべてのアプリケーションやウィジェットに適用されます。

この機能を有効にすると、明るい背景色が暗い色に、ダークテキストが明るい色に反転し、ユーザーに快適な閲覧体験を提供します。

また、OLEDディスプレイを持つデバイスでは、ダークモードを使用することでバッテリー寿命の延長にも寄与します。

○ダークモードの有効と無効の違い

ダークモードの有効時は、ユーザーインターフェース要素がダークカラースキームに適合するようになります。

一方で、ダークモードを無効にすると、標準のライトテーマが適用され、明るい背景にダークなテキストが表示されるように戻ります。

ダークモードの有無は、ユーザーの視覚的快適さだけでなく、アプリケーションのデザインと機能に大きな影響を及ぼします。

開発者は、この2つのモードを切り替える際に、UIの読みやすさを保持するために適切なカラーコントラストとデザイン要素を調整する必要があります。

●Objective-Cでダークモードを無効にする手順

iOSアプリ開発では、ユーザーの視覚的快適性を考慮してダークモードの対応が推奨されますが、特定の理由でダークモードを無効にしたい場合があります。

Objective-Cを使用することで、開発者はアプリ内でダークモードの使用を制御できるようになります。

ここではObjective-Cを用いてダークモードを無効にするための具体的な手順を説明していきます。

○サンプルコード1:Info.plistを編集する

iOS 13以降で導入されたダークモードは、アプリのInfo.plistを編集することで全体的に無効化することができます。

このファイルにはアプリの設定情報が含まれており、特定のキーを追加することでシステムに対してアプリのモードを伝えることが可能です。

コードの例として、次のようにUIUserInterfaceStyleキーをInfo.plistに追加し、その値をLightに設定すると、アプリが強制的にライトモードを使うようになります。

<key>UIUserInterfaceStyle</key>
<string>Light</string>

このコードではUIUserInterfaceStyleキーを使って、ユーザーインターフェイスのスタイルを設定しています。

この例ではLightを指定しており、ダークモードが無効になっている状態です。

○サンプルコード2:アプリ全体のダークモードを無効にする

アプリ全体にわたってダークモードを無効にする場合、AppDelegateに記述する方法があります。

AppDelegateはアプリのライフサイクルにおいて中心的な役割を果たすクラスです。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  if (@available(iOS 13.0, *)) {
      self.window.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
  }
  return YES;
}

このコードではdidFinishLaunchingWithOptionsメソッド内で、iOS 13.0以上であることを確認した上で、windowプロパティのoverrideUserInterfaceStyleUIUserInterfaceStyleLightに設定することで、アプリが起動する際にダークモードを無効にしています。

この設定により、アプリは常にライトモードで表示されます。

○サンプルコード3:特定のビューのみダークモードを無効にする

アプリの特定のビューまたはビューコントローラーだけでダークモードを無効にしたい場合、ビューのoverrideUserInterfaceStyleプロパティを設定します。

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    if (@available(iOS 13.0, *)) {
        self.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
    }
}
@end

このコードではViewControllerviewDidLoadメソッドをオーバーライドして、overrideUserInterfaceStyleプロパティをUIUserInterfaceStyleLightに設定しています。

これにより、このビューコントローラーは常にライトモードで表示されるようになります。

他のビューには影響せず、このビューだけが対象の設定になる点が特徴です。

●Objective-Cの応用例

Objective-CはiOS開発の歴史において長らく基幹言語であり、幅広い応用が可能です。

アプリの外見や挙動をカスタマイズする際もObjective-Cは非常に重宝されます。

特にiOS 13から導入されたダークモードはユーザー体験に大きな影響を与える機能で、多くの開発者が対応を迫られています。

ここでは、Objective-Cを使用してダークモードの設定をいくつかのシナリオで制御する方法について説明します。

○サンプルコード4:ユーザーの設定に応じてダークモードを制御する

ユーザーのシステム設定を尊重しつつ、アプリ内でダークモードを切り替える機能を実装する場合、Objective-Cでは次のようなアプローチをとります。

// UserInterfaceStyleを管理するためのメソッドの例
- (void)updateUserInterfaceStyle {
    if (@available(iOS 13.0, *)) {
        // ユーザーのダークモード設定を取得
        UIUserInterfaceStyle userStyle = [UITraitCollection currentTraitCollection].userInterfaceStyle;

        // 条件に応じてダークモードまたはライトモードを適用
        if (userStyle == UIUserInterfaceStyleDark) {
            // ダークモードを強制的に適用する場合
            self.view.overrideUserInterfaceStyle = UIUserInterfaceStyleDark;
        } else {
            // ライトモードを強制的に適用する場合
            self.view.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
        }
    } else {
        // iOS 13未満の処理
        // ダークモード非対応なので特に設定は不要
    }
}

このコードでは、まずiOS 13以降で利用可能なUIUserInterfaceStyleの値を取得しています。

ユーザーがシステムレベルでダークモードを有効にしているかどうかを判定した後、アプリのビューに対してユーザーの選択を反映させています。

iOS 13未満ではダークモードの概念がないため、何も設定せずに標準の表示を維持します。

このコードを実行すると、ユーザーのシステム設定に基づいて画面のスタイルが切り替わります。

たとえば、システムがダークモードに設定されている場合、アプリの該当ビューもダークモードの外見になるでしょう。

逆にライトモードが選択されていれば、そのスタイルで表示されます。

○サンプルコード5:設定画面からダークモードを無効にするオプションを提供する

次に、設定画面でダークモードを切り替えるオプションを提供する場合のサンプルコードです。

ユーザーがアプリ内の設定でスタイルを変更できるように、次の方法で実装します。

// 設定画面でのダークモード切り替え機能の実装例
- (void)toggleDarkMode:(BOOL)enabled {
    if (@available(iOS 13.0, *)) {
        self.view.overrideUserInterfaceStyle = enabled ? UIUserInterfaceStyleDark : UIUserInterfaceStyleLight;
    }
}

このメソッドは、設定画面のスイッチなどから呼び出されることを想定しています。

引数enabledYESの場合はダークモードを、NOの場合はライトモードを適用する簡単なロジックです。

iOSのバージョンチェックを行い、条件分岐でiOS 13未満の場合はこの機能を無視します。

この機能を使用すると、設定画面のスイッチ操作によって即座にアプリのスタイルが変わります。

ユーザーにとっては直感的で分かりやすい方法となり、設定のカスタマイズ性が向上します。

○サンプルコード6:システム設定の変更を検知してダークモードを切り替える

システムの設定が変更されたことを検知し、それに応じてアプリ内でダークモードを切り替えるには、NSNotificationを使ったイベント監視が有効です。

下記のコードスニペットを参考にしてください。

// システムの外観変更を監視する
- (void)observeSystemAppearanceChanges {
    if (@available(iOS 13.0, *)) {
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(systemAppearanceChanged:)
                                                     name:UIScreenDidConnectNotification
                                                   object:nil];
    }
}

// システムの外観変更時に呼ばれるメソッド
- (void)systemAppearanceChanged:(NSNotification *)notification {
    // 外観が変更された際の処理をここに記述
}

この例では、UIScreenDidConnectNotification通知を使用してシステムの外観が変わった時を捉えていますが、実際にはダークモードの変更を取得する適切な通知を選択する必要があります。

通知の設定とハンドリングはアプリの要件に応じて調整してください。

●注意点と対処法

Objective-Cを用いたiOSアプリケーション開発においてダークモード無効化に際し考慮すべき点は多岐にわたりますが、主なものにはiOSのバージョン差異とユーザーのアクセシビリティ設定への対応が挙げられます。

これらの点について、どのように対処すべきかを具体的に見ていきましょう。

○iOSバージョンによる違い

iOS13以降で導入されたダークモードは、適切なAPIの呼び出しによってコントロール可能ですが、これ以前のバージョンではダークモードの概念自体が存在しないため、コードを書く際はバージョンを意識する必要があります。

iOS13未満のバージョンではダークモード関連のAPIが無視されるため、コードにはバージョンチェックの条件分岐を入れることで対応します。

バージョンチェックを行うコードの例を紹介します。

if (@available(iOS 13.0, *)) {
    // iOS 13.0以上でダークモードの設定を行うコード
} else {
    // iOS 13.0未満ではダークモードの設定を無視する
}

このコードでは、@available構文を使ってiOSのバージョンが13.0以上かどうかをチェックしています。

13.0以上の場合にはダークモードの設定を行うブロック内にコードを記述し、それ未満の場合には何もせずに通常の明るいテーマを使用します。

○ユーザーのアクセシビリティ設定への対応

ユーザーの中には視覚的な理由からダークモードの使用を好む場合もあれば、逆にアクセシビリティの設定によりダークモードを避ける必要がある方もいます。

開発者は、アクセシビリティ設定に基づいてアプリの外観を適応させる必要があります。

Objective-Cでユーザーのアクセシビリティ設定を確認し、それに応じたコードを書く方法を紹介します。

if (@available(iOS 13.0, *)) {
    if (UIAccessibilityIsInvertColorsEnabled()) {
        // 色の反転が有効の場合、ダークモード設定を上書きする
    }
}

このコードでは、まずiOSバージョンが13.0以上であるかをチェックし、続いてUIAccessibilityIsInvertColorsEnabled関数を呼び出して色の反転設定が有効かどうかを確認しています。

色の反転が有効であれば、ダークモードの設定を上書きして、ユーザーのアクセシビリティ設定に優先して従います。

●カスタマイズ方法

Objective-Cにおけるカスタマイズ方法を解説するには、まず現状のiOSアプリケーションがどのようにダークモードと明るいモード(ライトモード)を切り替えているかを理解することが重要です。

ダークモードのカスタマイズでは、ユーザーのプリファレンスに合わせたテーマ設定の提供や、アプリケーションの特定部分における外観の微調整が可能になります。

こうしたカスタマイズを行うには、Objective-CのAPIを適切に利用し、条件分岐やプロパティの設定を行う必要があります。

○サンプルコード7:ダークモード無効時のスタイルのカスタマイズ

アプリケーションにおける見た目のスタイルをカスタマイズするためには、特定のUI要素に対してカラースキームを設定することが一般的です。

例えば、UILabelのテキスト色をダークモードが有効の場合と無効の場合で異なる色にすることで、ユーザーに快適な読みやすさを提供できます。

下記のコードスニペットは、ダークモード無効時にUILabelのテキスト色を変更しています。

// UILabelインスタンスを生成する
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 50)];

// ダークモードが無効かどうかをチェックする
if (@available(iOS 13.0, *)) {
    label.textColor = [UIColor labelColor]; // iOS 13以上で利用可能なラベルカラー
    label.overrideUserInterfaceStyle = UIUserInterfaceStyleLight; // 明るいモードに強制
} else {
    label.textColor = [UIColor blackColor]; // iOS 13未満の場合のデフォルトカラー
}

// ラベルをビューに追加する
[self.view addSubview:label];

このコードでは、まずUILabelのインスタンスを生成し、次にiOSのバージョンを確認して、適切なカラー設定を行っています。

iOS 13.0以降では、labelColorというダイナミックカラーを使用して自動でテキストカラーを調整しますが、ここではoverrideUserInterfaceStyleプロパティを使用して明るいモード(ライトモード)に設定し、ダークモードが無効になったときの外観をカスタマイズしています。

このコードの実行により、UILabelのテキスト色がユーザーのダークモード設定に関わらず、常に明るいモードのカラーに設定されるようになります。

これにより、ダークモードを使用しないユーザーの環境でもアプリケーションの見た目が一貫して保たれるという効果が得られます。

○サンプルコード8:アプリ内でダークモードのトグルを実装する

ユーザーがアプリ内で直接ダークモードとライトモードを切り替えられる機能は、カスタマイズ性の高いアプリを開発する上で重要な機能の一つです。

下記のコードスニペットは、セグメントコントロールを使用してダークモードとライトモードの切り替えを行う例を表しています。

// セグメントコントロールの生成
UISegmentedControl *modeSelector = [[UISegmentedControl alloc] initWithItems:@[@"Light", @"Dark"]];
modeSelector.frame = CGRectMake(0, 0, 200, 30);
modeSelector.selectedSegmentIndex = 0; // デフォルトで「Light」を選択
[self.view addSubview:modeSelector]; // セグメントコントロールをビューに追加

// セグメントコントロールの値が変更されたときのアクションを設定
[modeSelector addTarget:self action:@selector(toggleMode:) forControlEvents:UIControlEventValueChanged];

// モードを切り替えるメソッドの実装
- (void)toggleMode:(UISegmentedControl *)segment {
    if (segment.selectedSegmentIndex == 1) {
        self.overrideUserInterfaceStyle = UIUserInterfaceStyleDark; // ダークモードに切り替え
    } else {
        self.overrideUserInterfaceStyle = UIUserInterfaceStyleLight; // ライトモードに切り替え
    }
}

この例では、UISegmentedControlを使用して「Light」と「Dark」というセグメントを表示し、選択したセグメントに応じてoverrideUserInterfaceStyleプロパティを変更しています。

これにより、ユーザーはセグメントコントロールを切り替えるだけで、アプリケーションのダークモードまたはライトモードを手動で選択できるようになります。

このコードの実行によって、アプリケーション内でユーザーのインターフェーススタイルを直接コントロールできるようになります。

ユーザーが自分の好みに応じて画面の明るさを調節できることで、より使い勝手の良いアプリケーションを提供できます。

まとめ

Objective-Cでダークモードを無効にする過程を10ステップで解説した本記事では、iOSアプリの開発において、ユーザーインターフェイスの配色を明るいテーマに統一する方法を具体的なサンプルコードとともに紹介しました。

ダークモードの無効化は、ユーザーがシステム設定でダークモードを選択していても、アプリ自体のデザインコンセプトに合わせて明るいテーマを保持したい場合に重要です。

ユーザーがシステム設定でダークモードを好む場合であっても、アプリケーションレベルでの明るいテーマの維持を望む開発者にとって、このガイドが役立つことを願っています。