You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

点击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

火山引擎 最新活动