Темный режим не включается / отключается при использовании 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
стиль пользовательского интерфейса в конце концов.