web-dev-qa-db-ja.com

iOS 13でダークモードをオプトアウトすることは可能ですか?

私のアプリの大部分は、ネイティブ実装ではまだ利用できない機能を提供するWebビューで構成されています。 Webチームには、Webサイトにダークテーマを実装する計画はありません。そのため、iOS 13でダークモードをサポートすると、私のアプリは少し半分/半分に見えます。

アプリが常にウェブサイトのテーマに合わせてライトモードを表示するように、ダークモードのサポートをオプトアウトすることは可能ですか?

222
SeanR

まず、 Appleのエントリ は、ダークモードの無効化に関連しています。 このリンクのコンテンツは、Xcode 11およびiOS 13向けに記述されています

このセクションは、Xcode 11の使用に適用されます


アプリケーション全体をオプトアウトする場合

アプローチ#1

info.plistの次のキー ファイルを使用します。

UIUserInterfaceStyle

そして、Lightの値を割り当てます。

UIUserInterfaceStyle割り当ての[〜#〜] xml [〜#〜]

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

アプローチ#2

アプリのoverrideUserInterfaceStyle変数に対してwindowを設定できます。

プロジェクトの作成方法に応じて、これはAppDelegateファイルまたはSceneDelegateにあります。

if #available(iOS 13.0, *) {
    window?.overrideUserInterfaceStyle = .light
}

UIViewControllerを個別にオプトアウトする場合

override func viewDidLoad() {
    super.viewDidLoad()
    // overrideUserInterfaceStyle is available with iOS 13
    if #available(iOS 13.0, *) {
        // Always adopt a light interface style.
        overrideUserInterfaceStyle = .light
    }
}

overrideUserInterfaceStyleのAppleドキュメント

上記のコードがXcode 11でどのように見えるか:

enter image description here

このセクションは、Xcode 10.xの使用に適用されます


提出にXcode 11を使用している場合、この行の下のすべてを安全に無視できます。

関連するAPIはiOS 12には存在しないため、上記の値を使用しようとするとエラーが発生します。

overrideUserInterfaceStyleUIViewControllerを設定するには

enter image description here

UIViewControllerを個別にオプトアウトする場合

これは、コンパイラバージョンとiOSバージョンをテストすることにより、Xcode 10で処理できます。

#if compiler(>=5.1)
if #available(iOS 13.0, *) {
    // Always adopt a light interface style.
    overrideUserInterfaceStyle = .light
}
#endif

アプリケーション全体をオプトアウトする場合

次のコードをAppDelegateファイルに追加することにより、Xcode 10のアプリケーション全体に対して動作するように上記のスニペットを変更できます。

#if compiler(>=5.1)
if #available(iOS 13.0, *) {
    // Always adopt a light interface style.
    window?.overrideUserInterfaceStyle = .light
}
#endif

ただし、Xcodeバージョン10.xを使用する場合、plist設定は失敗します:

enter image description here

クレジット@ Aron Nelson@ Raimundas Sakalauskas@ NSLeaderおよびrmaddyフィードバックでこの回答を改善しました。

546
CodeBender

「iOSでのダークモードの実装」に関するAppleのセッション( https://developer.Apple.com/videos/play/wwdc2019/214/ 31:13以降)によると、overrideUserInterfaceStyleを設定することが可能です。ビューコントローラまたはビューのUIUserInterfaceStyleLightまたはUIUserInterfaceStyleDarkへ。これらは、サブビューまたはビューコントローラのtraitCollectionで使用されます。

SeanRで既に述べたように、アプリのplistファイルでUIUserInterfaceStyleLightまたはDarkに設定して、アプリ全体でこれを変更できます。

160
dorbeetle

Xcode 11以降(iOS 13以降のSDK)を使用していない場合、アプリは自動的にダークモードをサポートしません。そのため、ダークモードをオプトアウトする必要はありません。

Xcode 11以降を使用している場合、システムはアプリのダークモードを自動的に有効にします。好みに応じて、ダークモードを無効にする方法は2つあります。完全に無効にすることも、特定のウィンドウ、ビュー、またはビューコントローラーに対して無効にすることもできます。

アプリのダークモードを完全に無効にする

アプリのInfo.plistファイルにUIUserInterfaceStyleの値を持つLightキーを含めることで、ダークモードを無効にできます。
UIUserInterfaceStyle as Light
これはユーザーの設定を無視し、常にアプリに明るい外観を適用します。

ウィンドウ、ビュー、またはビューコントローラーのダークモードを無効にします

適切なウィンドウ、ビュー、またはビューコントローラーのoverrideUserInterfaceStyleプロパティを設定することで、インターフェイスを常に明るいスタイルまたは暗いスタイルで表示することができます。

ビューコントローラー:

override func viewDidLoad() {
    super.viewDidLoad()
    /* view controller’s views and child view controllers 
     always adopt a light interface style. */
    overrideUserInterfaceStyle = .light
}

ビュー:

// The view and all of its subviews always adopt light style.
youView.overrideUserInterfaceStyle = .light

窓:

/* Everything in the window adopts the style, 
 including the root view controller and all presentation controllers that 
 display content in that window.*/
window.overrideUserInterfaceStyle = .light

注:Appleは、アプリでダークモードをサポートすることを強くお勧めします。したがって、ダークモードを一時的にのみ無効にすることができます。

詳細はこちら: iOSアプリ用の特定のインターフェイススタイルの選択

58
Ajith R Nayak

********** Xcode 11以降で最も簡単な方法***********

これを</dict></plist>の前のinfo.plistに追加します

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

私は解決策を見つけたと思う。最初に IUserInterfaceStyle-Information Property List および IUserInterfaceStyle-UIKit からつなぎ合わせましたが、実際には iOSの特定のインターフェイススタイルの選択app

あなたのinfo.plistUIUserInterfaceStyleUser Interface Style)を1UIUserInterfaceStyle.light )。

編集:dorbeetleの答えによると、UIUserInterfaceStyleのより適切な設定はLightです。

27
SeanR

アプリ全体をオプトアウトする場合は、上記の答えが機能します。 UIを備えたlibで作業していて、.plistを編集する余裕がない場合は、コードを介して行うこともできます。

IOS 13 SDKに対してコンパイルする場合、次のコードを使用できます。

迅速:

if #available(iOS 13.0, *) {
    self.overrideUserInterfaceStyle = .light
}

Obj-C:

if (@available(iOS 13.0, *)) {
    self.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
}

[〜#〜] however [〜#〜]、あなたのコードをコンパイルしたい場合iOS 12 SDK too(今でも最新の安定したSDKです)、セレクターを使用する必要があります。セレクターを使用したコード:

Swift(XCodeはこのコードに対して警告を表示しますが、SDK 12にプロパティが存在しないためコンパイルできないため、現時点ではそれが唯一の方法です):

if #available(iOS 13.0, *) {
    if self.responds(to: Selector("overrideUserInterfaceStyle")) {
        self.setValue(UIUserInterfaceStyle.light.rawValue, forKey: "overrideUserInterfaceStyle")
    }
}

Obj-C:

if (@available(iOS 13.0, *)) {
    if ([self respondsToSelector:NSSelectorFromString(@"overrideUserInterfaceStyle")]) {
        [self setValue:@(UIUserInterfaceStyleLight) forKey:@"overrideUserInterfaceStyle"];
    }
}
22

最新アップデート

Xcode 10.xを使用している場合、デフォルトのUIUserInterfaceStyleはiOS 13.xのlightです。 iOS 13デバイスで実行すると、ライトモードでのみ動作します。

Info.plistファイルにUIUserInterfaceStyleキーを明示的に追加する必要はありません。追加すると、アプリの検証時に次のようにエラーが発生します。

無効なInfo.plistキー。 Payload/AppName.appInfo.plistファイルのキー 'UIUserInterfaceStyle'は無効です。

Xcode 11.xを使用する場合は、Info.plistファイルにUIUserInterfaceStyleキーのみを追加してください。

12

UIUserInterfaceStyleキーをplistファイルに追加する場合、おそらくAppleはここで述べたようにリリースビルドを拒否します: https://stackoverflow.com/a/56546554/7524146 とにかく各ViewController _self.overrideUserInterfaceStyle = .light_と明示的に伝えるのは面倒ですが、ルートのwindowオブジェクトに対してこの平和なコードを1回使用できます。

_if #available(iOS 13.0, *) {
    if window.responds(to: Selector(("overrideUserInterfaceStyle"))) {
        window.setValue(UIUserInterfaceStyle.light.rawValue, forKey: "overrideUserInterfaceStyle")
    }
}
_

application(application: didFinishLaunchingWithOptions:)内でこれを実行できないことに注意してください。なぜなら、このセレクターはその初期段階ではtrueに応答しないからです。ただし、後で実行できます。 AppDelegateでUIを自動的に起動する代わりに、アプリでカスタムAppPresenterまたはAppRouterクラスを使用している場合は、非常に簡単です。

9
SerhiiK

-アプリ全体(ウィンドウ)の場合:

_window!.overrideUserInterfaceStyle = .light
_

SceneDelegateからウィンドウを取得できます

-単一のViewControllerの場合:

_viewController.overrideUserInterfaceStyle = .light
_

ViewControllerの内部であっても、任意のviewControllerを設定できますit self

-単一のビューの場合:

_view.overrideUserInterfaceStyle = .light
_

ビューit内であっても、任意のviewを設定できますself

以前のiOSバージョンをサポートしている場合は、if #available(iOS 13.0, *) { ,,, }を使用する必要があります。

7

他の応答とは別に、次のことを理解していれば、iOS 13 SDK(XCode 11を使用)に対してコンパイルするときは、ダークモードを準備するだけで済みます。

システムは、iOS 13以降のSDKにリンクされたアプリが明るい外観と暗い外観の両方をサポートしていると想定しています。 iOSでは、特定のインターフェイススタイルをウィンドウ、ビュー、またはビューコントローラーに割り当てることで、特定の外観を指定します。 Info.plistキーを使用して、ダークモードのサポートを完全に無効にすることもできます。

リンク

6
Claudio

はい、viewDidLoadに次のコードを追加してスキップできます。

if #available(iOS 13.0, *) {
        // Always adopt a light interface style.
        overrideUserInterfaceStyle = .light
    }

私のアプリは現在、ダークモードをサポートしておらず、明るいアプリバーの色を使用しています。次のキーをInfo.plistに追加することで、ステータスバーのコンテンツを暗いテキストとアイコンに強制することができました。

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleDarkContent</string>
<key>UIUserInterfaceStyle</key>
<string>Light</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>

ここで他の可能な値を見つけてください: https://developer.Apple.com/documentation/uikit/uistatusbarstyle

2
ToniTornado

ダークモードをサポートまたはバイパスするためにアプリで使用できるいくつかのヒントとコツを以下に示します。

最初のヒント:ViewControllerスタイルをオーバーライドするには

uIViewControllerのインターフェイススタイルをオーバーライドするには

1:overrideUserInterfaceStyle = .dark //ダークモードの場合

2:overrideUserInterfaceStyle = .light //ライトモードの場合

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        overrideUserInterfaceStyle = .light    
    }
}

2番目のヒント:info.plistにキーを追加する

新しいキーを追加するだけです

UIUserInterfaceStyle

アプリのinfo.plistで値をLightまたはDarkに設定します。これにより、アプリのデフォルトスタイルが指定した値に上書きされます。すべてのviewControllerにoverrideUserInterfaceStyle = .lightこの行を追加する必要はありません。info.plistの1行だけです。

1

info.plistファイルに次のキーを追加するだけです:

<key>UIUserInterfaceStyle</key>
    <string>Light</string>
1
Moeen Ahmad

Objective-cバージョン

 if (@available(iOS 13.0, *)) {
        _window.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
    }
0
ahbou

Info.plistファイルに次の行を追加するだけです。

<key>UIUserInterfaceStyle</key>
<string>light</string>

これにより、アプリは強制的にライトモードでのみ実行されます。

0
Rahul Gusain
 if #available(iOS 13.0, *) {
            overrideUserInterfaceStyle = .light
        } else {
            // Fallback on earlier versions
        }
0
Talha Rasool

ウィンドウのプロパティはアプリのライフサイクル中に変更される可能性があるため、このソリューションを使用します。そのため、「overrideUserInterfaceStyle = .light」の割り当てを繰り返す必要があります。 UIWindow.appearance()を使用すると、新しく作成されたUIWindowオブジェクトに使用されるデフォルト値を設定できます。

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

      if #available(iOS 13.0, *) {
          UIWindow.appearance().overrideUserInterfaceStyle = .light
      }

      return true
    }
}
0
Dmitry