使用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
相关产品推荐
相关产品推荐

