1. 循环的方法
UISearchBar--改变内部输入框的背景颜色
思路是获取UISearchBar的子视图,判断他是否是输入框(注意不要先入为主地认为是UITextField),最后修改背景色。至于UISearchBar的子视图结构,在不同的iOS版本可能会不一样,可通过递归地调用description方法获知,具体可见链接http://blog.csdn.net/forestml2008/article/details/32914915
- (void)setSearchTextFieldBackgroundColor:(UIColor *)backgroundColor
{
UIView *searchTextField = nil;
if (IsiOS7OrLater) {
// 经测试, 需要设置barTintColor后, 才能拿到UISearchBarTextField对象
self.barTintColor = [UIColor whiteColor];
searchTextField = [[[self.subviews firstObject] subviews] lastObject];
} else { // iOS6以下版本searchBar内部子视图的结构不一样
for (UIView *subView in self.subviews) {
if ([subView isKindOfClass:NSClassFromString(@"UISearchBarTextField")]) {
searchTextField = subView;
}
}
}
searchTextField.backgroundColor = backgroundColor;
}
2. KVC方法,使用KVC自定义UISearchBar外观
在开发中,我们往往需要根据项目的风格来改变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上所有展示出来的子视图
for(UIView*viewin[[[_searchController.searchBar subviews]lastObject]subviews] ) {
if([viewisKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {}
if([viewisKindOfClass:NSClassFromString(@"UISearchBarTextField")]) {}
if([viewisKindOfClass:NSClassFromString(@"UINavigationButton")]) {}
}
2.通过KVC获取子视图
UIView*backgroundView = [_searchController.searchBar valueForKey:@"_background"];
UITextField *searchField = [_searchController.searchBar valueForKey:@"_searchField"];
UIButton*cancelButton = [_searchController.searchBar valueForKey:@"_cancelButton"];
3.//当我们获取cancelButton时,一定要确保cancelButton包含在了UISearchBar中,必要时可以提前调用:
[_searchController.searchBar setShowsCancelButton:YES animated:NO];
4.去掉搜索框背景
for(UIView*viewin[[[_searchController.searchBar subviews]lastObject]subviews] ) {
if([viewisKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
[view removeFromSuperview];
}
}
5.去掉搜索框边框
[_searchController.searchBar setBackgroundImage:[UIImage new]];
6.改变输入框文本
//提示文本颜色
UITextField*searchField = [_searchController.searchBar valueForKey:@"_searchField"];
[searchFieldsetTextColor:[UIColorblackColor]];
[searchFieldsetValue:[UIColorgrayColor]forKeyPath:@"_placeholderLabel.textColor"];
[searchFieldsetFont:[UIFontsystemFontOfSize:14]];
[searchFieldsetBackgroundColor:[UIColorwhiteColor]];
7. 改变取消按钮的title
UIButton*cancelButton = [_searchController.searchBar valueForKey:@"_cancelButton"];
[cancelButtonsetTitle:@"Close"forState:UIControlStateNormal];
网友评论