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

如何让UISearchController的SearchBar背景色呈现无色调的真实颜色?

解决UISearchController搜索栏无法显示纯白色的问题

我之前也踩过这个坑!你遇到的偏暗/灰白色问题,根源是UISearchBar的searchField内部默认带有一个半透明的背景视图,直接修改searchField.backgroundColor根本绕不开这个自带的层,所以颜色总是不对。

下面给你两种可靠的解决方法,分别适配不同iOS版本:

iOS 13+ 推荐写法(无需KVC)

Apple在iOS13之后公开了searchTextField属性,不用再通过valueForKey这种不太安全的方式获取输入框:

let searchController = UISearchController(searchResultsController: nil)
override func viewDidLoad() {
    super.viewDidLoad()
    navigationItem.searchController = searchController
    
    // 先清空searchBar的默认背景图,避免整体背景残留灰色
    searchController.searchBar.setBackgroundImage(UIImage(), for: .any, barMetrics: .default)
    
    // 获取公开的searchTextField属性
    let searchField = searchController.searchBar.searchTextField
    
    // 找到searchField内部的默认背景子视图,替换它的颜色
    if let backgroundView = searchField.subviews.first {
        backgroundView.backgroundColor = .white
        // 保持系统默认的圆角样式(可选,不想保留可以去掉)
        backgroundView.layer.cornerRadius = 10
        backgroundView.clipsToBounds = true
    }
    
    // 可选:调整光标和占位符颜色,避免和纯白背景冲突
    searchField.tintColor = .black
    searchField.attributedPlaceholder = NSAttributedString(string: "搜索", attributes: [.foregroundColor: UIColor.gray])
}

iOS 13以下兼容写法

如果需要适配更早的系统,就用KVC获取searchField,逻辑和上面一致:

let searchController = UISearchController()
override func viewDidLoad() {
    super.viewDidLoad()
    navigationItem.searchController = searchController
    
    searchController.searchBar.setBackgroundImage(UIImage(), for: .any, barMetrics: .default)
    
    guard let searchField = searchController.searchBar.value(forKey: "searchField") as? UITextField else { return }
    
    if let backgroundView = searchField.subviews.first {
        backgroundView.backgroundColor = .white
        backgroundView.layer.cornerRadius = 10
        backgroundView.clipsToBounds = true
    }
}

为什么之前的方法没用?

原来的searchField内部有个隐藏的背景子视图(不是searchField本身),这个视图默认带有半透明效果或者灰色的底色,直接给searchField.backgroundColor赋值,颜色会被这个子视图覆盖或者混合,所以看起来总是偏暗。我们直接修改这个子视图的背景色,才能得到真正的纯白色。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 13:49:09