Apple提供的UISearchController提供了方便的使用,但是设置一些属性和UI样式时很头疼,本文总结了部分配置供大家参考。
初始化
// 如果设置 searchResultsController 为nil,则搜索结果和历史记录等信息在当前页面处理,推荐传入一个自定义的Controller,可以方便解耦
let searchVC = WBSearchViewController(searchResultsController: mySearchResultController
设置代理
// 可以设置当前控制器,也可以设置自定义SearchController
searchVC.searchResultsUpdater = self
属性
// 设置textField颜色,通过设置颜色转图片实现
searchVC.searchBar.setSearchFieldBackgroundImage(UIImage(pureColor: UIColor(named: "custom_titleColor"), andSize: CGSize(width: 200, height: 40)), for: .normal)
// 不隐藏导航栏
searchVC.hidesNavigationBarDuringPresentation = false
// 隐藏遮罩,适用于点击搜索框后,展示历史记录等页面,设置true会有一层透明的黑色遮罩
searchVC.obscuresBackgroundDuringPresentation = false
适配iOS 13
因为 searchVC.searchBar.searchTextField
属性为13才有的,所以设置的时候得进行区分
let searchTextField: UITextField!
if #available(iOS 13.0, *) {
searchTextField = searchVC.searchBar.searchTextField
} else {
searchTextField = searchVC.searchBar.value(forKey: "_searchField") as? UITextField
}
// 设置圆角
searchTextField.layer.cornerRadius = 8.0
searchTextField.layer.masksToBounds = true
// 设置输入文字的颜色
searchTextField.textColor = UIColor.black
// 设置搜索🔍颜色
searchTextField.leftView?.tintColor = UIColor.systemGray
// 设置光标颜色
searchTextField.tintColor = UIColor.systemGray
// 设置取消按钮颜色
// 如果光标和取消按钮颜色统一设置直接设置searchVC.searchBar.tintColor即可
let attributes = [NSAttributedString.Key.foregroundColor : UIColor(named: "custom_titleColor"), NSAttributedString.Key.font : UIFont.systemFont(ofSize: 17)]
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).setTitleTextAttributes(attributes as [NSAttributedString.Key : Any], for: .normal)
这样设置后在点击搜索框展示SearchResultControlle时,会把导航栏遮住,设置下面的属性可以正常显示
// 设置此属性当点击搜索框时不会遮住导航栏
self.definesPresentationContext = true
适配DarkMode
颜色如果不用系统提供的system等颜色,建议在Assets里创建colorSet,并且配置Any、Light和Dark的颜色,用的时候直接取Color:name
因为searchVC是懒加载,所以在切换DarkMode时不会重新设置颜色,需要重写方法,然后进行设置
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
if #available(iOS 13.0, *) {
self.searchVC.searchBar.setSearchFieldBackgroundImage(UIImage(pureColor: UIColor(named: "custom_titleColor"), andSize: CGSize(width: 200, height: 40)), for: .normal)
}
}
展示搜索结果控制器
前面设置了 searchVC.searchResultsUpdater
后需要实现代理方法
// iOS13以后可以直接操作属性,以下的版本操作view.isHidden方法,效果相同
extension WBHomeViewController: UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
if #available(iOS 13.0, *) {
searchController.showsSearchResultsController = true
} else {
searchController.searchResultsController?.view.isHidden = false
}
}
}