如何修改UISearchController搜索栏中输入框的背景色?
解决UISearchController搜索输入框背景色修改问题
我刚好遇到过一模一样的问题!直接改searchController.searchBar.backgroundColor确实会搞乱顶部的布局,因为这个属性控制的是整个搜索栏的背景容器,而不是你要的那个输入框区域。下面给你几个靠谱的方案:
方法1:iOS 13+ 直接访问searchTextField(最推荐)
从iOS13开始,UISearchBar新增了searchTextField属性,可以直接拿到输入框控件,不用再费劲遍历子视图了:
// 设置输入框背景色 searchController.searchBar.searchTextField.backgroundColor = .white // 如果需要圆角的话还可以顺便调整样式 searchController.searchBar.searchTextField.layer.cornerRadius = 8 searchController.searchBar.searchTextField.layer.masksToBounds = true
这个方法最简洁,完全不会影响外层搜索栏的布局,完美匹配你的需求。
方法2:遍历子视图找到UITextField(兼容iOS13以下)
如果你的App需要兼容iOS13之前的版本,可以通过递归遍历UISearchBar的子视图来定位里面的UITextField:
func setupSearchTextFieldStyle() { // 递归查找子视图中的UITextField func findTargetTextField(in view: UIView) -> UITextField? { for subview in view.subviews { if let textField = subview as? UITextField { return textField } else if let foundTextField = findTargetTextField(in: subview) { return foundTextField } } return nil } if let targetTextField = findTargetTextField(in: searchController.searchBar) { targetTextField.backgroundColor = .white // 可选:调整输入框左侧搜索图标的颜色 targetTextField.leftView?.tintColor = .gray } }
在viewDidLoad或者搜索控制器配置完成后调用这个方法即可。
方法3:使用Appearance代理(全局统一样式)
如果你想让App内所有UISearchBar的输入框都用这个样式,可以用Appearance代理,精准限定范围避免影响普通UITextField:
// 在App启动时或者控制器初始化阶段设置 UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).backgroundColor = .white
这个方法适合全局统一设计风格的场景,不用逐个搜索栏单独配置。
额外提醒:
- 绝对不要直接修改
searchBar.backgroundColor,它影响的是整个搜索栏的背景容器,这就是你遇到顶部内边距问题的原因。 - 如果设置背景色后输入框的圆角和默认样式不协调,可以手动调整
layer.cornerRadius和masksToBounds来对齐设计要求。
内容的提问来源于stack exchange,提问作者developer
相关产品推荐
相关产品推荐

