今天在做项目的时候想要自定义搜索栏中的取消按钮的显示文字为取消,字体颜色为白色,自己试了很多次都失败了,后来想在网上搜索答案,发现我找到的这些博客都是比较早的版本,就是一句话根本解决不了现在的问题。
#pragma mark -----------------搜索栏代理--------------------
-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{
// 修改UISearchBar右侧的取消按钮文字颜色及背景图片
for (id searchbuttonsin [searchBar subviews])
if ([searchbuttons isKindOfClass:[UIButton class]]) {
UIButton *cancelButton = (UIButton*)searchbuttons;
// 修改文字颜色
[cancelButton setTitle:@"返回"forState:UIControlStateNormal];
[cancelButton setTitleColor:[UIColorwhiteColor] forState:UIControlStateNormal];
[cancelButton setTitleColor:[UIColorwhiteColor] forState:UIControlStateHighlighted];
}
}
后来自己debug看到这个循环只执行了一次,而且这个获取到的子视图正好是UIView(如下):
再去debug看视图的层级关系可以明显的看到在UISearchBar上有个UIView,而在UIView上有个UINavigationButton才是我们要找的cancel button,很显然UINavigationButton是继承与UIButton的,所以在上述的循环中海的再加一层循环,或者干脆取出[searchBar subview]的第一个或者最后一个元素都行,后来经查证发现以上方法只支持iOS7.0以下的版本,iOS7.0以上的都多加了一层UIView(代码改为如下):
#pragma mark -----------------搜索栏代理--------------------
-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{
// 修改UISearchBar右侧的取消按钮文字颜色及背景图片
for (id searchbuttonsin [[searchBarsubviews][0]subviews]) //只需在此处修改即可
if ([searchbuttons isKindOfClass:[UIButton class]]) {
UIButton *cancelButton = (UIButton*)searchbuttons;
// 修改文字颜色
[cancelButton setTitle:@"返回"forState:UIControlStateNormal];
[cancelButton setTitleColor:[UIColorwhiteColor] forState:UIControlStateNormal];
[cancelButton setTitleColor:[UIColorwhiteColor] forState:UIControlStateHighlighted];
}
}
那么接下来问题又来了运行后发现字是变成返回没错了,可是颜色并没有跟我们想象的一样变成白色的啊!!
后来更神奇的事情发生了,当我点击返回,再次点编辑框的时候返回两字居然奇迹般的变成白色的!!!!!!
又是一顿狂晕如千万只草泥马在我面前徘徊,试了多种办法,比如把设置代码放到搜索栏的其他代理方法中什么的,都没有什么卵用,后来我突然联想到UINavigationBar和UITabBar都有一个tintColor属性来设置上面按钮的颜色,抱着试一试的态度果断去UISearchBar头文件去找,果不其然就有这么一个属性!
二话不说赶紧去设置一下试试,将之前循环中的两个设置按钮字体颜色的代码注释掉,把设置UISearchController的代码中加上了
_searchC.searchBar.barTintColor = [UIColorwhiteColor];
结果真的就可以了!!!