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

使用navigationItem.searchController时UINavigationBar进入搜索状态变暗异常

嘿,这个问题我之前做项目的时候也踩过坑!其实罪魁祸首就是UISearchController的一个默认属性,咱们直接针对性调整就能解决,给你几个靠谱的思路:

1. 关闭搜索控制器的背景模糊变暗(最核心的解决方案)

UISearchController默认有个obscuresBackgroundDuringPresentation属性,值是true——这就是点击搜索栏时整个屏幕(包括导航栏)变暗的原因。把它改成false,背景就不会被模糊变暗,导航栏颜色就能保持原样,和「设置」应用的表现一致。

示例代码:

// 初始化搜索控制器(这里假设你不需要单独的搜索结果控制器,传nil即可)
let searchController = UISearchController(searchResultsController: nil)
// 关键设置:关闭背景模糊效果
searchController.obscuresBackgroundDuringPresentation = false
// 绑定到导航栏的搜索项
navigationItem.searchController = searchController
// 可选:如果希望搜索栏始终显示在导航栏上,加上这个(默认是滚动时隐藏)
navigationItem.hidesSearchBarWhenScrolling = false

2. 确保导航栏的样式配置正确

如果改了上面的属性还是有问题,可能是导航栏的半透明或颜色配置导致的。可以检查这两个点:

  • 关闭导航栏的半透明:半透明状态下,导航栏会和背后的视图颜色叠加,容易出现视觉上的变暗效果。
  • 明确设置导航栏的背景色:避免使用默认的半透明背景,指定固定颜色。

示例代码:

// 关闭导航栏半透明
navigationController?.navigationBar.isTranslucent = false
// 设置导航栏背景色(比如和系统设置一致的白色/系统背景色)
navigationController?.navigationBar.barTintColor = .systemBackground
// 适配iOS13+的导航栏外观(确保滚动和非滚动状态样式一致)
if #available(iOS 13.0, *) {
    let navAppearance = UINavigationBarAppearance()
    navAppearance.backgroundColor = .systemBackground
    navAppearance.titleTextAttributes = [.foregroundColor: UIColor.label]
    navigationController?.navigationBar.standardAppearance = navAppearance
    navigationController?.navigationBar.scrollEdgeAppearance = navAppearance
}

3. 排查自定义样式或第三方库干扰

如果你的项目里有自定义导航栏的分类、或者用了第三方导航栏框架,可能会覆盖系统默认的行为。可以暂时注释掉这些自定义代码,测试是否是它们导致的冲突。

苹果的「设置」应用之所以不会出现这个问题,就是因为系统默认给它的搜索控制器关闭了背景模糊,同时配置了统一的导航栏外观,咱们照着这个逻辑调整就ok啦!

内容的提问来源于stack exchange,提问作者gerbil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:04:33