前言
在iOS8中,Apple在UIKit框架中給我們提供了UISearchController來(lái)代替之前的UISearchDisplayController,在UISearchController中,我們無(wú)需再自己初始化UISearchBar,只需要提供searchResult展示的視圖。然而在開(kāi)發(fā)中,我們往往需要根據(jù)項(xiàng)目的風(fēng)格來(lái)改變UISearchBar的外觀,通過(guò)繼承的方式,我們可以完全定制符合項(xiàng)目風(fēng)格的外觀,然而有些情況下我們很難短時(shí)間內(nèi)完成全部的外觀定制工作,譬如我們項(xiàng)目用的好幾個(gè)舊框架,代碼中充斥著各種寫(xiě)好的UISearchBar的展示,而改動(dòng)底層框架并不是一個(gè)較好地實(shí)踐。于是我開(kāi)始搜索并總結(jié)出了幾個(gè)不通過(guò)繼承的方式來(lái)更改UISearchBar外觀的方法。
獲取子view
我們?cè)赨ISearchController或者是UISearchDisplayController中都可以直接獲取到UISearchBar的實(shí)例,我們可以從這里改變一些UISearchBar的屬性來(lái)改變外觀顯示。同時(shí)我們也可以直接獲取UISearchBar的subViews,UISearchBar的subView是一個(gè)UIView的實(shí)例,這個(gè)UIView包含了所有在UISearchBar上可以展示的子視圖,iOS SDK提供的UISearchBar,在iOS7之前是分為UISearchBarBackground、UISearchBarTextField、UIButton這幾個(gè)類的實(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];
去掉搜索框背景
for(UIView*viewin[[[_searchController.searchBar subviews]lastObject]subviews] ) {
if([viewisKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
[view removeFromSuperview];
}
}
去掉搜索框邊框
[_searchController.searchBar setBackgroundImage:[UIImage new]];
改變輸入框文本
//提示文本顏色
UITextField*searchField = [_searchController.searchBar valueForKey:@"_searchField"];
[searchFieldsetTextColor:[UIColorblackColor]];
[searchFieldsetValue:[UIColorgrayColor]forKeyPath:@"_placeholderLabel.textColor"];
[searchFieldsetFont:[UIFontsystemFontOfSize:14]];
[searchFieldsetBackgroundColor:[UIColorwhiteColor]];
改變?nèi)∠粹o的title
UIButton*cancelButton = [_searchController.searchBar valueForKey:@"_cancelButton"];
[cancelButtonsetTitle:@"Close"forState:UIControlStateNormal];