1. 循環(huán)的方法
UISearchBar--改變內(nèi)部輸入框的背景顏色
思路是獲取UISearchBar的子視圖绑雄,判斷他是否是輸入框(注意不要先入為主地認(rèn)為是UITextField)璧坟,最后修改背景色。至于UISearchBar的子視圖結(jié)構(gòu),在不同的iOS版本可能會(huì)不一樣瘫证,可通過(guò)遞歸地調(diào)用description方法獲知,具體可見(jiàn)鏈接http://blog.csdn.net/forestml2008/article/details/32914915
- (void)setSearchTextFieldBackgroundColor:(UIColor *)backgroundColor
{
UIView *searchTextField = nil;
if (IsiOS7OrLater) {
// 經(jīng)測(cè)試, 需要設(shè)置barTintColor后, 才能拿到UISearchBarTextField對(duì)象
self.barTintColor = [UIColor whiteColor];
searchTextField = [[[self.subviews firstObject] subviews] lastObject];
} else { // iOS6以下版本searchBar內(nèi)部子視圖的結(jié)構(gòu)不一樣
for (UIView *subView in self.subviews) {
if ([subView isKindOfClass:NSClassFromString(@"UISearchBarTextField")]) {
searchTextField = subView;
}
}
}
searchTextField.backgroundColor = backgroundColor;
}
2. KVC方法具滴,使用KVC自定義UISearchBar外觀(guān)
在開(kāi)發(fā)中士嚎,我們往往需要根據(jù)項(xiàng)目的風(fēng)格來(lái)改變UISearchBar的外觀(guān)呜魄,通過(guò)繼承的方式,我們可以完全定制符合項(xiàng)目風(fēng)格的外觀(guān)莱衩,然而有些情況下我們很難短時(shí)間內(nèi)完成全部的外觀(guān)定制工作爵嗅,譬如我們項(xiàng)目用的好幾個(gè)舊框架,代碼中充斥著各種寫(xiě)好的UISearchBar的展示笨蚁,而改動(dòng)底層框架并不是一個(gè)較好地實(shí)踐睹晒。于是我開(kāi)始搜索并總結(jié)出了幾個(gè)不通過(guò)繼承的方式來(lái)更改UISearchBar外觀(guān)的方法趟庄。
獲取子view
我們?cè)赨ISearchController或者是UISearchDisplayController中都可以直接獲取到UISearchBar的實(shí)例,我們可以從這里改變一些UISearchBar的屬性來(lái)改變外觀(guān)顯示伪很。同時(shí)我們也可以直接獲取UISearchBar的subViews,UISearchBar的subView是一個(gè)UIView的實(shí)例戚啥,這個(gè)UIView包含了所有在UISearchBar上可以展示的子視圖,iOS SDK提供的UISearchBar锉试,在iOS7之前是分為UISearchBarBackground猫十、UISearchBarTextField、UIButton這幾個(gè)類(lèi)的實(shí)例組成键痛,而在iOS7之后炫彩,是將UIButton轉(zhuǎn)換為了UINavigationButton的實(shí)例匾七。
1.我們可以通過(guò)循環(huán)遍歷出UISearchBar上所有展示出來(lái)的子視圖
for(UIView*viewin[[[_searchController.searchBar subviews]lastObject]subviews] ) {
if([viewisKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {}
if([viewisKindOfClass:NSClassFromString(@"UISearchBarTextField")]) {}
if([viewisKindOfClass:NSClassFromString(@"UINavigationButton")]) {}
}
2.通過(guò)KVC獲取子視圖
UIView*backgroundView = [_searchController.searchBar valueForKey:@"_background"];
UITextField *searchField = [_searchController.searchBar valueForKey:@"_searchField"];
UIButton*cancelButton = [_searchController.searchBar valueForKey:@"_cancelButton"];
3.//當(dāng)我們獲取cancelButton時(shí)絮短,一定要確保cancelButton包含在了UISearchBar中,必要時(shí)可以提前調(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];