You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 09:17:39