1. 循環(huán)的方法
UISearchBar--改變內(nèi)部輸入框的背景顏色
思路是獲取UISearchBar的子視圖,判斷他是否是輸入框(注意不要先入為主地認為是UITextField),最后修改背景色。至于UISearchBar的子視圖結(jié)構,在不同的iOS版本可能會不一樣,可通過遞歸地調(diào)用description方法獲知,具體可見鏈接http://blog.csdn.net/forestml2008/article/details/32914915
- (void)setSearchTextFieldBackgroundColor:(UIColor *)backgroundColor
{
UIView *searchTextField = nil;
if (IsiOS7OrLater) {
// 經(jīng)測試, 需要設置barTintColor后, 才能拿到UISearchBarTextField對象
self.barTintColor = [UIColor whiteColor];
searchTextField = [[[self.subviews firstObject] subviews] lastObject];
} else { // iOS6以下版本searchBar內(nèi)部子視圖的結(jié)構不一樣
for (UIView *subView in self.subviews) {
if ([subView isKindOfClass:NSClassFromString(@"UISearchBarTextField")]) {
searchTextField = subView;
}
}
}
searchTextField.backgroundColor = backgroundColor;
}
2. KVC方法,使用KVC自定義UISearchBar外觀
在開發(fā)中,我們往往需要根據(jù)項目的風格來改變UISearchBar的外觀,通過繼承的方式,我們可以完全定制符合項目風格的外觀,然而有些情況下我們很難短時間內(nèi)完成全部的外觀定制工作,譬如我們項目用的好幾個舊框架,代碼中充斥著各種寫好的UISearchBar的展示,而改動底層框架并不是一個較好地實踐。于是我開始搜索并總結(jié)出了幾個不通過繼承的方式來更改UISearchBar外觀的方法。
獲取子view
我們在UISearchController或者是UISearchDisplayController中都可以直接獲取到UISearchBar的實例,我們可以從這里改變一些UISearchBar的屬性來改變外觀顯示。同時我們也可以直接獲取UISearchBar的subViews,UISearchBar的subView是一個UIView的實例,這個UIView包含了所有在UISearchBar上可以展示的子視圖,iOS SDK提供的UISearchBar,在iOS7之前是分為UISearchBarBackground、UISearchBarTextField、UIButton這幾個類的實例組成,而在iOS7之后,是將UIButton轉(zhuǎn)換為了UINavigationButton的實例。
1.我們可以通過循環(huán)遍歷出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中,必要時可以提前調(diào)用:
[_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. 改變?nèi)∠粹o的title
UIButton*cancelButton = [_searchController.searchBar valueForKey:@"_cancelButton"];
[cancelButtonsetTitle:@"Close"forState:UIControlStateNormal];