項(xiàng)目中需要使用搜索功能溉浙,之前都是使用UISearchBar+UISearchDisplayController或者如果你需要高度定制搜索框應(yīng)該用UITextField加上點(diǎn)擊事件完成。因?yàn)橄胪祽校揖褪褂昧薸OS 8.0以后推出的新類UISearchController弄匕,畢竟我們的項(xiàng)目只是向下適配到8.0, 為了避免以后廢棄API等問(wèn)題籽慢,我就直接使用了UISearchController,結(jié)果發(fā)現(xiàn)各種坑.
1.我先粘出在問(wèn)題的截圖
在我使用UISearchController的過(guò)程中,遇到了一個(gè)奇葩的問(wèn)題竣贪,我的展示界面和搜索界面是同一個(gè)界面帚湘,就是下面這句代碼
//創(chuàng)建UISearchController _searchController = [[UISearchController alloc]initWithSearchResultsController:nil];
我沒(méi)有單獨(dú)創(chuàng)建一個(gè)UITableViewContrller用來(lái)展示搜索后的數(shù)據(jù)源內(nèi)容玫荣,這樣點(diǎn)擊searchBar后,UISearchBar會(huì)自動(dòng)占據(jù)導(dǎo)航欄(其實(shí)是一個(gè)屬性hidesNavigationBarDuringPresentation)大诸,置為YES捅厂,點(diǎn)擊searchBar后會(huì)自動(dòng)隱藏導(dǎo)航欄(如下圖),我建議將此屬性置為true资柔,否則將導(dǎo)致UISearchBar在導(dǎo)航欄下下沉44的高度焙贷。出現(xiàn)此問(wèn)題的原因下面會(huì)提到。
我出現(xiàn)的問(wèn)題是下面這張截圖所示
每次點(diǎn)擊searchBar出現(xiàn)左上第一個(gè)界面贿堰,此時(shí)點(diǎn)擊取消按鈕辙芍,返回展示界面,但是UISearchBar會(huì)往上偏移羹与,如右上界面所示故硅,我是真的無(wú)語(yǔ)了,而且這個(gè)問(wèn)題只在iOS 9.0以下出現(xiàn)注簿,在9.0以上是好的契吉。導(dǎo)航欄會(huì)遮擋UISearchBar,每次返回都會(huì)向上偏移20的高度诡渴。
在網(wǎng)上找到的解決方案有以下幾種:
1.在-(UISearchController *)searchController方法里加上 self.definesPresentationContext = YES;
這行代碼
2.在合適的地方添加[self.searchController.searchBar sizeToFit];
3.在viewDidDisappear方法中添加self.navigationBar.translucent = NO;
這行代碼
方案1捐晶,設(shè)置definesPresentationContext為true,可以保證在UISearchController在激活狀態(tài)下用戶push到下一個(gè)view controller之后search bar不會(huì)仍留在界面上妄辩。但我之前說(shuō)明了我的展示界面和搜索界面是同一個(gè)控制器惑灵。所以這個(gè)方案并沒(méi)有解決我的問(wèn)題。
蘋果對(duì)它官方的解釋是// know where you want UISearchController to be displayed
a眼耀、如果不添加上面這行代碼英支,在設(shè)置hidesNavigationBarDuringPresentation這個(gè)屬性為YES的時(shí)候,搜索框進(jìn)入編輯模式會(huì)導(dǎo)致哮伟,searchbar不可見干花,偏移-64;
在設(shè)置為NO的時(shí)候,進(jìn)入編輯模式輸入內(nèi)容會(huì)導(dǎo)致高度為64的白條楞黄,猜測(cè)是導(dǎo)航欄沒(méi)有渲染出來(lái)
b池凄、如果添加了上面這行代碼,在設(shè)置hidesNavigationBarDuringPresentation這個(gè)屬性為YES的時(shí)候鬼廓,輸入框進(jìn)入編輯模式正常顯示和使用;在設(shè)置為NO的時(shí)候肿仑,搜索框進(jìn)入編輯模式導(dǎo)致向下偏移64,具體原因暫時(shí)未找到
方案2:當(dāng)你沒(méi)有設(shè)置searchBar的frame時(shí),這行代碼可以幫助你調(diào)整searchBar的位置尤慰。只是輔助作用馏锡,其實(shí)UISearchBar的默認(rèn)高度就是44,
方案3:translucent屬性的設(shè)置與否伟端,與self.view的Frame的位置相關(guān)杯道。當(dāng)translucent設(shè)為NO時(shí),self.view的位置荔泳,從navbar下邊界開始蕉饼。反之亦然。這也沒(méi)有解決我的問(wèn)題
2.下面是我在網(wǎng)上粘的可以用的示例
1.其中[self shuffledAlphabet] 是個(gè)產(chǎn)生三個(gè)隨機(jī)字母的方法,其中該類需要遵循四個(gè)代理方法玛歌,包含UITableViewDelegate,UITableViewDataSource擎椰,UISearchControllerDelegate支子,UISearchResultsUpdating。因?yàn)閁ISearchController都是和UITableView配合使用的达舒。
2.[self shuffledAlphabet]方法截圖
3.遵循UITableViewDataSource協(xié)議的方法
datalist是原始數(shù)據(jù)值朋,searchList是搜索后的數(shù)據(jù)內(nèi)容。
4.遵循UISearchResultsUpdating協(xié)議的方法巩搏,該方法是對(duì)搜索內(nèi)容進(jìn)行篩選的方法
圖中藍(lán)色框圈住的代碼昨登,是因?yàn)槲翼?xiàng)目中需要修改UISearchController中UISearchBar的取消按鈕的顏色和文字,我使用的KVC的方式去修改的贯底,還有遍歷UISearchBar的子控件方式去修改丰辣。默認(rèn)的取消按鈕的文字是Cancel
5.遵循UISearchControllerDelegate協(xié)議的方法
直接使用上面的示例代碼,就可以解決我出現(xiàn)的問(wèn)題禽捆,使用上面的示例代碼笙什,一定記住要將searchController的searchBar添加到tableView的tableHeaderView,之前我是直接將searchBar添加到了self.view上胚想,并且也沒(méi)有設(shè)定它的frame.
[self.view addSubview:_searchController.searchBar];
最讓我郁悶的是我寫了個(gè)demo測(cè)試琐凭,完全沒(méi)問(wèn)題,但是粘進(jìn)我的項(xiàng)目中使用浊服,就會(huì)出現(xiàn)之前的問(wèn)題统屈,經(jīng)過(guò)我的部分修改終于解決了上移問(wèn)題,我懷疑是Xcode犯病了牙躺,但是同時(shí)又會(huì)冒出來(lái)一個(gè)新問(wèn)題愁憔,如下圖
搜索出現(xiàn)的結(jié)果,cell的部分會(huì)和searchBar重疊述呐,為了解決這個(gè)問(wèn)題惩淳,我在下面這兩個(gè)代理方法中,加了幾行代碼
并且一定要在- (void)updateSearchResultsForSearchController:(UISearchController *)searchController方法中加上這句代碼self.edgesForExtendedLayout = UIRectEdgeNone;//不加的話,UISearchBar返回后會(huì)上移
簡(jiǎn)書里還有一篇文章介紹了這種情況思犁,下面是鏈接代虾,你可以參考下。
UISearchController淺析
總結(jié)的有點(diǎn)亂激蹲,有什么不懂的你可以留言問(wèn)我棉磨,很久沒(méi)發(fā)文了,以后會(huì)整理項(xiàng)目中遇到的問(wèn)題学辱。