Mr.Javed Multani
Mr.Javed Multani

Reputation: 13294

How to use dark mode in iOS simulator?

While I am developing the iOS app I need to test it in simulator with dark mode option so I can get more clarity about the app UI. But when I go to the Setting I am not getting option for dark mode as real device showing.

Upvotes: 409

Views: 145255

Answers (9)

otaviokz
otaviokz

Reputation: 382

I know it's not exactly what the author asked, but if you're using SwiftUI you can check how a View looks in Light or Dark themes directly in the Preview canvas, as shown in the image: SwiftUI View preview options

Upvotes: -1

Ashley Mills
Ashley Mills

Reputation: 53181

In Settings, scroll down to Developer and then Dark Appearance

enter image description here


Update

In addition to the above, there are now many other ways to enable dark appearance in the simulator, as shown in the many great answers below.

• Change Environment Overrides from Xcode (@AshCameron)

• Toggle Appearance A from the Simulator menu (@Shredder2794)

• Update from the command line using xcrun simctl ui booted appearance … (@blackjacx, @tadija)

• Programmatically using overrideUserInterfaceStyle = .dark (@thisIsTheFoxe)

• Use SimGenie from Curtis Herbert…  https://simgenie.app

Upvotes: 826

Akshay Kumar Karanam
Akshay Kumar Karanam

Reputation: 11

you can use keyboard shortcut shift + command + A to toggle appearance of simulator.

Upvotes: -4

Praxder
Praxder

Reputation: 2769

You can use the "Toggle Appearance" (ShiftCommandA) setting from the Simulator menu:

Simulator > Features > Toggle Appearance ⇧⌘A

Toggle Appearance

Upvotes: 98

blackjacx
blackjacx

Reputation: 10510

Automated Appearance Change 🦉

Xcode 11.4 🌟

Apple released a powerful Xcode update which contains some useful things for this topic. Appearance can now be selected directly in the simulator. Just select Features > Toggle Appearance or ++A. The automatic appearance switching could stil be important, e.g. for automated screenshot tests on the command line. The script becomes easy like this when using Xcode 11.4:

device_ids=("C741F3CD-FDAC-49EA-A4DB-7F797B97291E" "428183B6-3EB8-4D36-9938-9D07C141BF49")

# The value to use is now just 'dark' or 'light'
appearance=dark

for device in "${device_ids[@]}"; do
  xcrun simctl boot $device
  xcrun simctl ui $device appearance $appearance
done

No more simulator killing or re-setting needed which is a huge performance win. Also no fiddling around with any plist tools anymore - ever. keep in mind that you have to use device ids that are available in the runtime you use. Find them out using xcrun simctl list.

See also my complete script: https://github.com/Blackjacx/Scripts/blob/master/set-simulator-style.sh

Xcode 11.3

There is a way using the command line to switch a simulator between light and dark mode. If you have an array with your device IDs you can do the following:

device_ids=("C741F3CD-FDAC-49EA-A4DB-7F797B97291E" "428183B6-3EB8-4D36-9938-9D07C141BF49")

# Determine the plist value for the desired style: "dark" -> 2 / "light" -> 1
style=2

for device_id in "${device_ids[@]}"; do
  plist_path="${HOME}/Library/Developer/CoreSimulator/Devices/${device_id}/data/Library/Preferences/com.apple.uikitservices.userInterfaceStyleMode.plist"  
  printf '\n%s' "Set style $style for device $device_id ($plist_path)"

  killall "Simulator"
  xcrun simctl shutdown booted
  xcrun simctl erase $device_id

  # Crate the plist since it might not be available after erase
  [[ ! -f "$plist_path" ]] && /usr/libexec/PlistBuddy -c "save" $plist_path  
  # Set the style mode
  plutil -replace UserInterfaceStyleMode -integer $style $plist_path
done

If you want to specify device names in your script - since device IDs are different on different machines - you can also easily find the id's of them using the following bash code:

device_names=("iPhone SE" "iPhone 8" "iPhone 11 Pro" "iPhone 11 Pro Max")
device_ids=()

for name in "${device_names[@]}"; do
  id=$(xcrun simctl list --json | jq ".devices | .[] | .[] | select(.name == \"$name\") | .udid" | cut -d\" -f2)
  device_ids+=("$id")
done

printf '%s\n' "${device_ids[@]}"

Upvotes: 18

tadija
tadija

Reputation: 3271

from terminal:

xcrun simctl ui booted appearance light

xcrun simctl ui booted appearance dark

Upvotes: 12

Jayprakash Dubey
Jayprakash Dubey

Reputation: 36447

There are two ways to enable dark mode in Simulator. Note: Make sure that you’re using iOS 13 simulator. X-D

Solution 1: Change build settings

  1. Open Settings app
  2. Select Developer
  3. Enable Dark appearance

Screenshot-1

Solution 2: Programmatically

Simply add this code block in your ViewController file.

override func viewDidLoad() {
    super.viewDidLoad()
    #if DEBUG
    // This changes appearance only for debug mode
    overrideUserInterfaceStyle = .dark
    #endif
}

Screenshot-2

Check this apple docs for more details.

Upvotes: 7

thisIsTheFoxe
thisIsTheFoxe

Reputation: 1713

Alternatively, you can also switch the appearance programmatically (docs):

override func viewDidLoad() {
    super.viewDidLoad()
    #if DEBUG
    // change the appearance only while testing  
    overrideUserInterfaceStyle = .dark
    #endif
}

Upvotes: 12

Ash Cameron
Ash Cameron

Reputation: 1958

You can toggle the interface mode (i.e. Light / Dark) as well as adjust dynamic type setting on the fly (when the simulator is running) like this:

Dark mode with Xcode

Upvotes: 121

Related Questions