UISearchBar相对于后面的UISearchDisplayController和UISearchController更底层。后面两种搜索方式的实现都是建立在其基础之上。采用该类实现搜索可以不用担心点击输入搜索内容时视图自带往上移动的问题,并且可以随意设置搜索框的位置。
a、创建示例:
UISearchBar *searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(70, 9, DEVICE_WIDTH-140, 28)];
searchBar.placeholder = @"请输入搜索内容";
searchBar.barStyle = UISearchBarStyleMinimal;
searchBar.delegate = self;
UITextField *searchField1 = [searchBar valueForKey:@"_searchField"];
searchField1.backgroundColor = [UIColor whiteColor];
searchBar.tintColor = [UIColor blackColor];
[self.navigationController.navigationBar addSubview:searchBar];
b、搜索时执行的回调方法:
在协议UISearchBarDelegate中,如- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText;
c、搜索结果的展示:
搜索结果的展示这里可以进行灵活的自定义。
2、UISearchDisplayController
UISearchDisplayController在原有的UISearchBar上进行进一步的封装,直接将搜索框视图和搜索对象源绑定在一起,同时也对外提供了配置展示视图的入口.searchResultsTableView ,一般多用tableView作为搜索结果展示视图。
搜索时执行的方法在协议UISearchDisplayDelegate中,如方法
- (void) searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller NS_DEPRECATED_IOS(3_0,8_0);等。
3、UISearchController
在iOS8以后UISearchDisplayController被UISearchController替换掉。UISearchController直接将 UISearchBar封装在了类内部,初始化的时候不再从外部传入UISearchBar,只需要将用于展示搜索结果的视图控制器传入。UISearchController将对搜索结果进行更新的代理者和监控UISearchBar事件响应的代理者分离开了,分别为.searchResultsUpdater和.delegate
a、创建代码:
SearchResultViewController *resultVC = [[SearchResultViewController alloc]init];
self.searchControl = [[SearchViewController alloc]initWithSearchResultsController:resultVC];
self.searchControl.delegate = self;
self.searchControl.searchResultsUpdater = self;
self.searchControl.searchBar.placeholder = @"请输入搜索内容";
self.searchControl.dimsBackgroundDuringPresentation = NO;
[self.searchControl.searchBar sizeToFit];
//颜色设置
_searchControl.searchBar.barTintColor = [UIColor orangeColor];
//开启允许另一个tvc做呈现的控制器
// self.definesPresentationContext = YES;
self.tableView.tableHeaderView = self.searchControl.searchBar;
4、自定义搜索框视图的部分参数设置
//光标颜色
[[[_searchControl.searchBar.subviews objectAtIndex:0].subviews objectAtIndex:1] setTintColor:[UIColor XXX]];
//字体颜色
UITextField *searchField = [_searchControl.searchBar valueForKey:@"_searchField"];
searchField.textColor = [UIColor XXX];
//placeHolder颜色
[searchField setValue:[UIColor XXX] forKeyPath:@"_placeholderLabel.textColor"];
//取消按钮文字、颜色
[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:[NSArray arrayWithObject:[UISearchBar class]]]setTintColor:[UIColor XXX]];
[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:[NSArray arrayWithObject:[UISearchBar class]]]setTitle:@"XX"];
其中,修改cancel按钮为中文的大致有三种方式,但最好的就是上面这种处理方式。其余两种方式分别为:
a、文字更改:[searchBar setValue:@"取消" forKey:@"_cancelButtonText"];
颜色设置:searchBar.tintColor = [UIColor XX];(注:这种方式可以达到需要的效果,但是在改变颜色的时候光标的颜色也会和 cancel按钮的颜色一致)
b、无论是上面哪种搜索的实现方式,在其输入信息便触发的方法里面执行以下代码:
UIView *topView = searchBar.subviews[0];
for (UIView *subView in topView.subviews) {
if ([subView isKindOfClass:NSClassFromString(@"UINavigationButton")]) {
UIButton *cancelButton = (UIButton*)subView;
[cancelButton setTitle:@"取消" forState:UIControlStateNormal]; //@"取消"
[cancelButton setTintColor:[UIColor whiteColor]];
}
}
(注:该方式英文变为中文没问题,但是当第一次出现“取消”按钮时,取消按钮的颜色仍是系统的,以后再出现便是我们自己所设置的颜色)
另外也可以采用a中的颜色设置和b中的中文内容设置结合。