私のアプリの大部分は、ネイティブ実装ではまだ利用できない機能を提供するWebビューで構成されています。 Webチームには、Webサイトにダークテーマを実装する計画はありません。そのため、iOS 13でダークモードをサポートすると、私のアプリは少し半分/半分に見えます。
アプリが常にウェブサイトのテーマに合わせてライトモードを表示するように、ダークモードのサポートをオプトアウトすることは可能ですか?
まず、 Appleのエントリ は、ダークモードの無効化に関連しています。 このリンクのコンテンツは、Xcode 11およびiOS 13向けに記述されています:
アプリケーション全体をオプトアウトする場合
info.plistの次のキー ファイルを使用します。
UIUserInterfaceStyle
そして、Light
の値を割り当てます。
UIUserInterfaceStyle
割り当ての[〜#〜] xml [〜#〜]:
<key>UIUserInterfaceStyle</key>
<string>Light</string>
アプリの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でどのように見えるか:
提出にXcode 11を使用している場合、この行の下のすべてを安全に無視できます。
関連するAPIはiOS 12には存在しないため、上記の値を使用しようとするとエラーが発生します。
overrideUserInterfaceStyle
にUIViewController
を設定するには
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設定は失敗します:
クレジット@ Aron Nelson、@ Raimundas Sakalauskas、@ NSLeaderおよびrmaddyフィードバックでこの回答を改善しました。
「iOSでのダークモードの実装」に関するAppleのセッション( https://developer.Apple.com/videos/play/wwdc2019/214/ 31:13以降)によると、overrideUserInterfaceStyle
を設定することが可能です。ビューコントローラまたはビューのUIUserInterfaceStyleLight
またはUIUserInterfaceStyleDark
へ。これらは、サブビューまたはビューコントローラのtraitCollection
で使用されます。
SeanRで既に述べたように、アプリのplistファイルでUIUserInterfaceStyle
をLight
またはDark
に設定して、アプリ全体でこれを変更できます。
Xcode 11以降(iOS 13以降のSDK)を使用していない場合、アプリは自動的にダークモードをサポートしません。そのため、ダークモードをオプトアウトする必要はありません。
Xcode 11以降を使用している場合、システムはアプリのダークモードを自動的に有効にします。好みに応じて、ダークモードを無効にする方法は2つあります。完全に無効にすることも、特定のウィンドウ、ビュー、またはビューコントローラーに対して無効にすることもできます。
アプリのダークモードを完全に無効にする
アプリのInfo.plistファイルにUIUserInterfaceStyle
の値を持つ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アプリ用の特定のインターフェイススタイルの選択
********** Xcode 11以降で最も簡単な方法***********
これを</dict></plist>
の前のinfo.plistに追加します
<key>UIUserInterfaceStyle</key>
<string>Light</string>
私は解決策を見つけたと思う。最初に IUserInterfaceStyle-Information Property List および IUserInterfaceStyle-UIKit からつなぎ合わせましたが、実際には iOSの特定のインターフェイススタイルの選択app 。
あなたのinfo.plist
、UIUserInterfaceStyle
(User Interface Style)を1( UIUserInterfaceStyle.light
)。
編集:dorbeetleの答えによると、UIUserInterfaceStyle
のより適切な設定はLight
です。
アプリ全体をオプトアウトする場合は、上記の答えが機能します。 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"];
}
}
最新アップデート
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
キーのみを追加してください。
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
クラスを使用している場合は、非常に簡単です。
_window!.overrideUserInterfaceStyle = .light
_
SceneDelegate
からウィンドウを取得できます
_viewController.overrideUserInterfaceStyle = .light
_
ViewControllerの内部であっても、任意のviewController
を設定できますit self
_view.overrideUserInterfaceStyle = .light
_
ビューit内であっても、任意のview
を設定できますself
以前のiOSバージョンをサポートしている場合は、if #available(iOS 13.0, *) { ,,, }
を使用する必要があります。
他の応答とは別に、次のことを理解していれば、iOS 13 SDK(XCode 11を使用)に対してコンパイルするときは、ダークモードを準備するだけで済みます。
システムは、iOS 13以降のSDKにリンクされたアプリが明るい外観と暗い外観の両方をサポートしていると想定しています。 iOSでは、特定のインターフェイススタイルをウィンドウ、ビュー、またはビューコントローラーに割り当てることで、特定の外観を指定します。 Info.plistキーを使用して、ダークモードのサポートを完全に無効にすることもできます。
はい、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
ダークモードをサポートまたはバイパスするためにアプリで使用できるいくつかのヒントとコツを以下に示します。
uIViewControllerのインターフェイススタイルをオーバーライドするには
1:overrideUserInterfaceStyle = .dark //ダークモードの場合
2:overrideUserInterfaceStyle = .light //ライトモードの場合
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
overrideUserInterfaceStyle = .light
}
}
新しいキーを追加するだけです
UIUserInterfaceStyle
アプリのinfo.plistで値をLightまたはDarkに設定します。これにより、アプリのデフォルトスタイルが指定した値に上書きされます。すべてのviewControllerにoverrideUserInterfaceStyle = .lightこの行を追加する必要はありません。info.plistの1行だけです。
info.plist
ファイルに次のキーを追加するだけです:
<key>UIUserInterfaceStyle</key>
<string>Light</string>
if (@available(iOS 13.0, *)) {
_window.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
}
Info.plistファイルに次の行を追加するだけです。
<key>UIUserInterfaceStyle</key>
<string>light</string>
これにより、アプリは強制的にライトモードでのみ実行されます。
if #available(iOS 13.0, *) {
overrideUserInterfaceStyle = .light
} else {
// Fallback on earlier versions
}
ウィンドウのプロパティはアプリのライフサイクル中に変更される可能性があるため、このソリューションを使用します。そのため、「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
}
}