Темный режим не включается / отключается при использовании window.overrideUserInterfaceStyle на iPad

Я успешно реализовал переключение темного режима, позвонив window.overrideUserInterfaceStyleв моем приложении. При запуске приложения на реальном iPhone или симуляторе функция работает нормально.

Но когда я запускаю тот же сценарий на iPad, только view.overrideUserInterfaceStyleработает. Если я попытаюсь использоватьwindow.overrideUserInterfaceStyle он не обновляет коллекцию признаков (и не вызывает traitCollectionDidChange(_).

Чтобы изменить стиль, который я делаю (стиль с белого на темный):

UIApplication.shared.connectedScenes.forEach { (scene: UIScene) in
    (scene.delegate as? SceneDelegate)?.window?.overrideUserInterfaceStyle = .dark //Just this one works on iPhone.
}
UIApplication.shared.delegate?.window??.overrideUserInterfaceStyle = .dark //Force
UIWindow.appearance().overrideUserInterfaceStyle = .dark //Force

Когда код выполняется выше, он должен заменить цвет всех UIViews, которые настроены с UIColorдля светлых и темных стилей. Также звонитеtraitCollectionDidChange(_). Но ни одно из этих действий не происходит в симуляторе iPad.

Этот код выше работает только на реальном / симуляторе iPhone, он также должен работать на симуляторе iPad. У меня нет iPad, способного к темному стилю.

Может это глюк на симуляторе?

Я также попытался создать образец приложения, и изменение стиля действительно работает на iPad, но поскольку это чистый проект без библиотек, он должен работать.

Я также пытаюсь свернуть свое приложение, но оно все еще не работает, поэтому я боюсь, что это библиотека, создающая конфликт.

Проблема также возникает при использовании UIApplication установка вместо UIScene.

Я использую Xcode 11.3 и Swift 5 с некоторыми библиотеками Cocoapod.

1 ответ

Решение

Если вы используете собственный переход, я рекомендую вам установить viewController.overrideUserInterfaceStyle = .unspecified после того, как вы закончите анимацию.

Как это:

if #available(iOS 13.0, *) {
    viewController.overrideUserInterfaceStyle = .dark
}

UIView.animate(withDuration: defaultAnimationDuration, delay: 0, animations: {
    //animate viewController
}, completion: { [weak self] _ in
    if #available(iOS 13.0, *) {
        viewController.overrideUserInterfaceStyle = .unspecified
    }
})

Это сделает ваш UIViewController следовать UIWindow стиль пользовательского интерфейса в конце концов.

Другие вопросы по тегам