对UISearchController 所遇到的坑进行汇总
一、更改背景颜色
方法 1:
_searchController.searchBar.searchBarStyle = UISearchBarStyleMinimal;
_searchController.searchBar.backgroundImage = [UIImage imageWithColor:[UIColor grayColor] size:CGSizeMake(_searchController.searchBar.width,26)];
[_searchController.searchBar setSearchFieldBackgroundImage:[UIImage imageWithColor:[UIColor whiteColor] size:CGSizeMake(ScreenWidth-14,26)] forState:UIControlStateNormal];
方法 2:
jcSearchView.searchBar.tintColor = JF_MAIN_COLOR//修改光标颜色,取消按钮颜色
jcSearchView.searchBar.isTranslucent = false// 取消半透明
jcSearchView.searchBar.barTintColor = UIColor.white// 更改背景颜色
jcSearchView.searchBar.searchBarStyle = UISearchBarStyle.prominent
/// 修改searchBar的文本颜色
let textField:UITextField = jcSearchView.searchBar.value(forKey: "_searchField") as! UITextField
textField.backgroundColor = UIColor.init(red: 235/255, green: 235/255, blue: 235/255, alpha: 1)
二、更改搜索按钮
在代理方法通过kvc 进行获取
func updateSearchResults(for searchController: UISearchController) {
searchController.searchBar.showsCancelButton = true
let btn:UIButton? = searchController.searchBar.value(forKey: "_cancelButton") as? UIButton
if btn != nil {
btn!.setTitle("取消", for: UIControlState.normal)
}
}
三、进入编辑模式 searchbar 上移64 或者下移64的方法解决
1.searchbar 上移64,添加代码
self.definesPresentationContext = YES;
给出的解释是:
设置definesPresentationContext为YES,可以保证在UISearchController在激活状态下用户push到下一个view controller之后search bar不会仍留在界面上。
苹果对它官方的解释是// know where you want UISearchController to be displayed
a、如果不添加上面这行代码,在设置hidesNavigationBarDuringPresentation这个属性为YES的时候,搜索框进入编辑模式会导致,searchbar不可见,偏移-64;
在设置为NO的时候,进入编辑模式输入内容会导致高度为64的白条,猜测是导航栏没有渲染出来
b、如果添加了上面这行代码,在设置hidesNavigationBarDuringPresentation这个属性为YES的时候,输入框进入编辑模式正常显示和使用;在设置为NO的时候,搜索框进入编辑模式导致向下偏移64
2.searchbar 下移64
很多网上的帖子都说没有找到解决方式,经过我的脱坑经验,问题在于navigationBar的半透明和非半透明的原因, 当你设置一下属性:
self.definesPresentationContext = true
searchController.hidesNavigationBarDuringPresentation = ture
当navigationController?.navigationBar.isTranslucent = true 也就是navigationBar为半透明的时候是没有问题的
但是 navigationBar不是半透明的时候 肯定会下移64
现在给你解决方法
方法1:
self.extendedLayoutIncludesOpaqueBars = YES;
self.edgesForExtendedLayout = UIRectEdgeNone
方法2:通过修改navigationBar的透明状态
public func willPresentSearchController(_ searchController: UISearchController){
navigationController?.navigationBar.isTranslucent = true
}
public func willDismissSearchController(_ searchController: UISearchController){
navigationController?.navigationBar.isTranslucent = false
}
方法3: 我没测试测试!!
答案在这:https://stackoverflow.com/questions/28326269/uisearchbar-presented-by-uisearchcontroller-in-table-header-view-animates-too-fa/30010473#30010473
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar
{
if (bar == searchController.searchBar) {
return UIBarPositionTopAttached;
}
else { // Handle other cases
return UIBarPositionAny;
}
}
四、 进入编辑模式 searchbar 上移20px 每次累加问题
添加下面代码:
self.automaticallyAdjustsScrollViewInsets = false;
附一些简单的坑 看看这个就可以了:https://blog.csdn.net/yishengzhiai005/article/details/79129366