如何让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
相关产品推荐
相关产品推荐

