前言
在iOS8中,Apple在UIKit框架中给我们提供了UISearchController
来代替之前的UISearchDisplayController
,在UISearchController
中,我们无需再自己初始化UISearchBar
,只需要提供searchResult展示的视图。然而在开发中,我们往往需要根据项目的风格来改变UISearchBar
的外观,通过继承的方式,我们可以完全定制符合项目风格的外观,然而有些情况下我们很难短时间内完成全部的外观定制工作,譬如我们项目用的好几个旧框架,代码中充斥着各种写好的UISearchBar
的展示,而改动底层框架并不是一个较好地实践。于是我开始搜索并总结出了几个不通过继承的方式来更改UISearchBar外观的方法。
获取子view
我们在UISearchController
或者是UISearchDisplayController
中都可以直接获取到UISearchBar
的实例,我们可以从这里改变一些UISearchBar的属性来改变外观显示。同时我们也可以直接获取UISearchBar的subViews,UISearchBar的subView是一个UIView的实例,这个UIView包含了所有在UISearchBar上可以展示的子视图,iOS SDK提供的UISearchBar,在iOS7之前是分为UISearchBarBackground
、UISearchBarTextField
、UIButton
这几个类的实例组成,而在iOS7之后,是将UIButton转换为了UINavigationButton
的实例。
1.我们可以通过循环遍历出UISearchBar上所有展示出来的子视图
1 2 3 4 5
| for(UIView*viewin[[[_searchController.searchBar subviews]lastObject]subviews] ) { if([view isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {} if([view isKindOfClass:NSClassFromString(@"UISearchBarTextField")]) {} if([view isKindOfClass:NSClassFromString(@"UINavigationButton")]) {} }
|
2.通过KVC获取子视图
1 2 3
| UIView *backgroundView = [_searchController.searchBar valueForKey:@"_background"]; UITextField *searchField = [_searchController.searchBar valueForKey:@"_searchField"]; UIButton *cancelButton = [_searchController.searchBar valueForKey:@"_cancelButton"];
|
1
| [_searchController.searchBar setShowsCancelButton:YES animated:NO];
|
去掉搜索框背景
1 2 3 4 5
| for(UIView*viewin[[[_searchController.searchBar subviews]lastObject]subviews] ) { if([view isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) { [view removeFromSuperview]; } }
|
去掉搜索框边框
1
| [_searchController.searchBar setBackgroundImage:[UIImage new]];
|
改变输入框文本
1 2 3 4 5 6 7 8 9 10 11
|
UITextField*searchField = [_searchController.searchBar valueForKey:@"_searchField"];
[searchFieldsetTextColor:[UIColorblackColor]];
[searchFieldsetValue:[UIColorgrayColor]forKeyPath:@"_placeholderLabel.textColor"];
[searchFieldsetFont:[UIFontsystemFontOfSize:14]];
[searchFieldsetBackgroundColor:[UIColorwhiteColor]];
|
改变取消按钮的title
1 2 3
| UIButton*cancelButton = [_searchController.searchBar valueForKey:@"_cancelButton"];
[cancelButtonsetTitle:@"Close"forState:UIControlStateNormal];
|