使用KVC自定義UISearchBar外觀

前言

在iOS8中,Apple在UIKit框架中給我們提供了UISearchController來代替之前的UISearchDisplayController,在UISearchController中,我們無需再自己初始化UISearchBar,只需要提供searchResult展示的視圖。然而在開發中,我們往往需要根據項目的風格來改變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];

去掉搜索框背景

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]];

改變取消按鈕的title

UIButton*cancelButton = [_searchController.searchBar valueForKey:@"_cancelButton"];

[cancelButtonsetTitle:@"Close"forState:UIControlStateNormal];

原文鏈接:鄭少博的技術博客--自定義UISearchBar外觀

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容