如何使LaunchScreen匹配代码设置的明暗主题模式?
问题原因
LaunchScreen 是在应用正式启动前就完成渲染的,而你在 didFinishLaunchingWithOptions 里的代码是应用启动后才执行的,所以这时候修改主题根本影响不到已经渲染好的 LaunchScreen,它只会读取 Info.plist 里预设的 UIUserInterfaceStyle 值。
解决方案
根据你的需求不同,有两种处理方式:
方式一:让 LaunchScreen 跟随系统主题
直接把 Info.plist 里的 UIUserInterfaceStyle 设置为 Automatic,这样 LaunchScreen 会自动匹配当前系统的亮暗模式,不需要额外代码处理。
方式二:让 LaunchScreen 跟随用户自定义的主题(非系统主题)
因为无法在 LaunchScreen 渲染前执行自定义代码读取用户设置,所以可以用过渡页面的方式实现连贯效果:
- 先保持 LaunchScreen 原样,在应用启动后,创建一个和 LaunchScreen 布局完全一致的视图控制器(比如叫
LaunchTransitionVC) - 在这个过渡 VC 里先应用用户设置的主题(和你在
didFinishLaunchingWithOptions里的逻辑一致) - 显示这个过渡 VC,停留1-2秒或者直接无缝过渡到主界面,用户视觉上会觉得 LaunchScreen 是跟随自定义主题的
另外,如果你不想加过渡 VC,也可以把 LaunchScreen 里的所有元素(图片、文字颜色等)都放到 Assets 资源里,设置为支持亮暗模式,但这种方式只能跟随系统主题,没法匹配用户在应用内自定义的主题设置。
代码优化建议
你当前的代码可以稍微调整,避免 rootWindow 为 nil 的情况:
let theme = keyValueStore.getValue(for: .themeSwitch) ?? false // 初始化默认值(仅当不存在时) if keyValueStore.getValue(for: .themeSwitch) == nil { keyValueStore.set(value: false, for: .themeSwitch) } // 确保获取到有效window if let window = UIApplication.shared.windows.first { window.overrideUserInterfaceStyle = theme ? .dark : .light }
内容的提问来源于stack exchange,提问作者Alisher Baigazin
相关产品推荐
相关产品推荐

