iOS切换StoryBoard根控制器时StatusBar样式延迟更新求助
解决状态栏样式切换延迟的问题
你遇到的状态栏样式切换延迟,核心原因是直接替换window.rootViewController后,系统不会自动立即触发状态栏外观的更新,需要我们手动通知系统重新计算状态栏样式。
问题定位
当你通过appDelegate.window?.rootViewController = navController切换根控制器时,系统虽然完成了视图控制器的替换,但状态栏样式的更新会被延迟到下一个runloop周期,导致视觉上出现延迟现象。
解决方案
在每次设置完rootViewController之后,手动调用系统的状态栏更新方法,强制立即刷新样式。修改你的按钮点击代码如下:
第一个ViewController的按钮点击方法修改:
@IBAction func btnInitialControllerTapped(_ sender: Any) { let controller = UIStoryboard(name: "Initial", bundle: nil).instantiateViewController(withIdentifier: "InitialViewController") as! InitialViewController let navController = UINavigationController.init(rootViewController: controller) appDelegate.window?.rootViewController = navController // 手动触发状态栏样式更新,消除延迟 UIApplication.shared.setNeedsStatusBarAppearanceUpdate() }
第二个ViewController的按钮点击方法修改:
@IBAction func btnControllerTapped(_ sender: Any) { let storyboard = UIStoryboard(name:"Main", bundle: nil) let vc = storyboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController let navigationController = UINavigationController(rootViewController: vc) appDelegate.window?.rootViewController = navigationController // 手动触发状态栏样式更新,消除延迟 UIApplication.shared.setNeedsStatusBarAppearanceUpdate() }
额外检查点
另外注意到你描述里提到「第一个StoryBoard内所有ViewController的statusBarStyle为.lightContent」,但你的第一个ViewController代码中preferredStatusBarStyle返回的是.default,这里可能存在代码与需求不匹配的情况,如果最终样式不符合预期,可以调整该返回值。
原理说明
setNeedsStatusBarAppearanceUpdate()会告知系统状态栏样式需要重新计算,系统会立刻询问当前顶层视图控制器的preferredStatusBarStyle值,并同步更新状态栏外观,从而彻底解决切换时的延迟问题。
内容的提问来源于stack exchange,提问作者Kuldeep
相关产品推荐
相关产品推荐

