滑动隐藏UINavigationController时状态栏变黑的问题求助
解决导航栏滑动隐藏时状态栏样式异常的问题
这个问题我之前也碰到过,本质是当导航栏通过hidesBarsOnSwipe隐藏后,系统对状态栏样式的判断逻辑发生了变化,导致原本设置的浅色样式失效。咱们一步步来修复:
核心原因
你已经在UINavigationController的扩展里重写了preferredStatusBarStyle,但当导航栏隐藏时,系统可能会优先使用顶层ViewController的状态栏设置,或者因为导航栏的样式关联被切断,导致状态栏切回默认的黑色。
解决方案
1. 确保Info.plist的关键设置
首先检查你的Info.plist,必须设置View controller-based status bar appearance为YES(这是iOS 7+的默认值,但如果被修改过会出问题)。这个设置确保系统会使用ViewController层级里的preferredStatusBarStyle,而不是全局的UIApplication设置。
2. 完善导航控制器的扩展
修改你的UINavigationController扩展,确保不管导航栏是否隐藏,都强制返回浅色状态栏样式,同时配置导航栏的barStyle来匹配:
extension UINavigationController { override open var preferredStatusBarStyle: UIStatusBarStyle { // 始终返回浅色样式,不受导航栏状态影响 return .lightContent } func transparentNavigation() { guard let pacificoFont = UIFont(name: "Pacifico", size: 20) else { return } // 设置导航栏barStyle为黑色,默认关联浅色状态栏 navigationBar.barStyle = .black // 透明导航栏的常规配置 navigationBar.setBackgroundImage(UIImage(), for: .default) navigationBar.shadowImage = UIImage() navigationBar.isTranslucent = true // 配置标题样式 navigationBar.titleTextAttributes = [ .font: pacificoFont, .foregroundColor: UIColor.white ] // 开启滑动隐藏导航栏 hidesBarsOnSwipe = true } override open func viewDidLoad() { super.viewDidLoad() // 监听导航栏隐藏状态变化,强制更新状态栏样式 NotificationCenter.default.addObserver( self, selector: #selector(updateStatusBarStyle), name: UINavigationController.hidesBarsOnSwipeDidChangeNotification, object: nil ) } @objc private func updateStatusBarStyle() { // 通知系统重新计算状态栏样式 setNeedsStatusBarAppearanceUpdate() } deinit { NotificationCenter.default.removeObserver(self) } }
3. 确保子ViewController同步设置
在你的CollectionViewController里也重写preferredStatusBarStyle,避免系统优先读取子控制器的设置:
class YourCollectionViewController: UICollectionViewController { override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } // ... 其他代码 }
验证效果
做完上面的设置后,向上滚动CollectionView隐藏导航栏时,状态栏会保持浅色;向下滚动显示导航栏时,也会维持白色,不会再出现样式跳变的问题。
内容的提问来源于stack exchange,提问作者Jack Daniel
相关产品推荐
相关产品推荐

