Как я могу проверить, включен ли темный режим в iOS/iPadOS?

Начиная с iOS/iPadOS 13, доступен темный стиль пользовательского интерфейса, аналогичный темному режиму, представленному в macOS Mojave. Как я могу проверить, активировал ли пользователь общесистемный темный режим?

Ответ 1

Вам следует проверить переменную userInterfaceStyle в UITraitCollection, так же, как в tvOS и macOS.

switch traitCollection.userInterfaceStyle {
case .light: //light mode
case .dark: //dark mode
case .unspecified: //the user interface style is not specified
}

Вы должны использовать функцию traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) UIView/UIViewController для обнаружения изменений в среде интерфейса (включая изменения в стиле пользовательского интерфейса).

Из документации разработчика Apple:

Система вызывает этот метод при изменении среды интерфейса iOS. Реализуйте этот метод в контроллерах представления и представлениях, в соответствии с потребностями ваших приложений, чтобы реагировать на такие изменения. Например, вы можете настроить макет подпредставлений контроллера представления, когда iPhone поворачивается из книжной в альбомную ориентацию. Реализация по умолчанию этого метода пуста.

Элементы пользовательского интерфейса системы по умолчанию (такие как UITabBar или UISearchBar) автоматически адаптируются к новому стилю пользовательского интерфейса.

Ответ 2

Как уже упоминалось в daveextreme, проверка стиля пользовательского интерфейса текущего представления не всегда возвращает системный стиль при использовании свойства overrideUserInterfaceStyle. В таких случаях может быть лучше использовать следующий код:

switch UIScreen.main.traitCollection.userInterfaceStyle {
case .light: //light mode
case .dark: //dark mode
case .unspecified: //the user interface style is not specified
}

Ответ 3

Для iOS 13 вы можете использовать это свойство, чтобы проверить, является ли текущий стиль темным режимом или нет:

if #available(iOS 13.0, *) {
    if UITraitCollection.current.userInterfaceStyle == .dark {
        print("Dark mode")
    }
    else {
        print("Light mode")
    }
}

Ответ 4

в target-c вы хотели бы сделать:

if( self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark ){

        //is dark
}else{

    //is light

}

Ответ 5

Лучшей точкой для обнаружения изменений является функция traitCollectionDidChange (_ previousTraitCollection: UITraitCollection?) Функции UIView/UIViewController.

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)

    let userInterfaceStyle = traitCollection.userInterfaceStyle // Either .unspecified, .light, or .dark
    // Update your user interface based on the appearance
}

Обнаружение изменений внешнего вида тривиально, переопределив traitCollectionDidChange на контроллерах представления. Затем просто откройте контроллеры представления traitCollection.userInterfaceStyle.

Однако важно помнить, что traitCollectionDidChange может вызываться для других изменений признаков, таких как вращение устройства. Вы можете проверить, отличается ли текущий внешний вид, используя этот новый метод:

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)

    let hasUserInterfaceStyleChanged = previousTraitCollection.hasDifferentColorAppearance(comparedTo: traitCollection) // Bool
    // Update your user interface based on the appearance
}

Ответ 6

Вы можете использовать это расширение:

import UIKit

extension UIApplication {
    @available(iOS 13.0, *)
    var userInterfaceStyle: UIUserInterfaceStyle? {
        return self.keyWindow?.traitCollection.userInterfaceStyle
    }
}

@available(iOS 13.0, *)
    func setSystemTheme() {
        switch UIApplication.shared.userInterfaceStyle {
        case .dark?:
            currentTheme = .dark
        case .light?:
            currentTheme = .light
        default:
            break
        }
    }

Ответ 7

UIKit уже некоторое время проводит UITraitCollection. Начиная с iOS 9 вы можете использовать UITraitCollection, чтобы увидеть, поддерживает ли устройство 3D Touch (грустный разговор на другой день)

Ну, в iOS 13 UITraitCollection получает новое свойство: var userInterfaceStyle: UIUserInterfaceStyle которое поддерживает три случая: light, dark и unspecified

Поскольку UIViewController наследует UITraitEnvironment, у вас есть доступ к traitCollection traitCollection. Это хранит userInterfaceStyle.

UITraitEnviroment также имеет несколько отличных заглушек протокола, которые помогают вашему коду интерпретировать, когда происходят изменения состояния (например, когда пользователь переключается с Темной стороны на Светлую или наоборот). Вот хороший пример кодирования для вас:

class MyViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        if self.traitCollection.userInterfaceStyle == .dark {
            // User Interface is Dark
        } else {
            // User Interface is Light
        }

    }


    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        // Trait collection has already changed
    }

    override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
        // Trait collection will change. Use this one so you know what the state is changing to.
    }
}

Ответ 8

1/для UIView/UIViewController:

self.traitCollection.userInterfaceStyle == .dark

2/для статического или другого:

UITraitCollection.current.userInterfaceStyle == .dark

НО:

//Never use this! You will get wrong value in app extensions (ex. ToDay widget)
UIScreen.main.traitCollection.userInterfaceStyle == .dark //WRONG!