App で Dark Appearance に対応するには・・・(Dark Appearance を無効にする)

iOS 12 辺りから?でしたか?Dark Appearance というのがあり、目に優しい感じがして自分でも利用しているわけですが、App 製作者からすると、これまた厄介な問題が・・・

何が問題なのかと言うと、一番困るのが画像。background color として白を想定していたものの、Dark Appearance を有効にすると background color は自動で黒になる。画像の背景を透明色にしていれば、一応、background color と馴染むのでよい。往々にして、画像の背景色を透明にしておらず白にしていることが多く、そうだとすると多大な違和感が出てくる。もっと言うと、背景が白前提で絵を描いてもらっているので、背景が黒になると、あれなんか変だ、素人目で見て明らかに変だと言うこともある。

それじゃあ、background color を強制的に白指定にすればイイじゃん、と思いきや、話はそう単純ではない。開発者のことを考えて、label の文字は default で、Light Appearance なら label 文字の色は黒に、Dark Appearance なら label の文字は白に、と、Apple さん、やるじゃん、ちゃんと考えてるじゃん、手間かかんないようにしてくれてるじゃん、と言う訳。

話をまとめると、background color と label 文字色は Appearance に応じて自動。でも、画像の背景色は自動じゃないので、背景は透過にしておけばなんとなくOK。

今日ハマったのは、time slot の画面も、Dark Appearance では、文字が見えなくなってしまい困った。さらに、先にも触れた通り、背景が白前提で画像を作っているので、背景が黒になるとなんか違和感が・・・と言うのがある。

一応、利用者の環境に合わせて、画像を差し替えることは可能。具体的にはこんな感じ:

 

    UITraitCollection *trait = self.view.traitCollection;

    if (@available(iOS 12.0, *)) {

        if ( UIUserInterfaceStyleDark == trait.userInterfaceStyle )

        {

            // NSLog( @"I am dark." );

            self.logo.image = [UIImage imageNamed:@"dark.jpg"];

        }

        else

        {

            // NSLog( @"I am light." );

            self.logo.image = [UIImage imageNamed:@"light.jpg"];

        }

    } else {

        // Fallback on earlier versions

    }

 

明らかに欠点なのが、code のあちこちにこういった記述が必要な訳で、maintain の観点から堪えられない、と言うのがある。

結論として、利用者の環境に合わせず、Dark Appearance が指定されていても無視して、常に Light Appearance にならないのかと。

できるんですね(あっさり)。方法は次の通り:

  1. info.plist を開く
  2. Appearance property 追加
  3. Appearance property の value に string 型、Light を追加

これで、ユーザーの設定に関わらず、常に Light Appearance で動作する。

(ってか、初めからそれ教えてよ・・・> Apple