UISearchController 基本配置 2020年配置iOS13 以及 DarkMode

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
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值