点击SearchBar取消按钮后StatusBar变黑,如何保持状态栏白色?
解决搜索栏取消后状态栏变黑的问题
问题背景
我给初始界面配置了浅色样式的自定义导航控制器,并通过搜索栏实现数组筛选功能(界面为浅色导航栏搭配白色状态栏),但点击取消按钮或关闭搜索结果时,状态栏会变为黑色。
下面分享几个亲测有效的解决办法:
方案1:让自定义导航控制器强制使用白色状态栏
最省心的方式是直接在你的自定义导航控制器中固定状态栏样式,不管内部页面状态如何变化都不会改变。
Swift 实现代码:
class CustomNavigationController: UINavigationController { override var preferredStatusBarStyle: UIStatusBarStyle { // 强制设置为白色状态栏 return .lightContent } }
Objective-C 实现代码:
@interface CustomNavigationController : UINavigationController @end @implementation CustomNavigationController - (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } @end
方案2:在搜索栏取消时手动触发状态栏样式更新
有时候搜索栏的交互会干扰系统对状态栏样式的判断,我们可以在点击取消按钮时主动刷新样式:
Swift 代码示例:
// 确保你的视图控制器遵守UISearchBarDelegate协议 class MainViewController: UIViewController, UISearchBarDelegate { func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { // 收起键盘 searchBar.resignFirstResponder() // 手动触发状态栏样式更新 setNeedsStatusBarAppearanceUpdate() } // 同时确保当前控制器返回白色状态栏样式 override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } }
方案3:检查全局状态栏设置
别忘记确认项目的Info.plist文件中,View controller-based status bar appearance这个键的值是YES。只有开启这个设置,我们在控制器中定义的状态栏样式才会生效,否则系统会使用全局默认设置。
问题根源
搜索栏激活时,系统会临时调整界面上下文(比如弹出键盘、改变导航栏状态),取消搜索后如果没有正确恢复样式判断逻辑,就会导致状态栏变黑。上面的方案要么强制固定样式,要么主动触发更新,都能完美解决这个问题。
内容的提问来源于stack exchange,提问作者Diego Isco




