[iOS筆記]使用UISearchController,UISearchBar的顯示問題

最近做搜索的時候使用了UISearchController遇到以下的問題:

先說說大概實現(xiàn):可以對tableView上的數(shù)據(jù)進(jìn)行搜索邮利,并在原有的tableView上顯示出搜索結(jié)果馋吗。tableViewCell是可以點擊的,并且進(jìn)行界面的切換夜畴。

界面.png

問題一:

點擊SearchBar進(jìn)入了編輯狀態(tài)時,再點擊顯示出來的cell删壮,跳轉(zhuǎn)頁面時searchBar并沒有跟著view向左滑動贪绘,而是停留在原來的位置,如圖一央碟。

圖一.png

原因:
UISearchController也是繼承自UIViewController的税灌,也就是說UISearchController也有一個自己的View。但是在使用時只把他的searchBar顯示在表頭而沒有把自帶的view添加到self.view上,就是未指定哪一個controller顯示UISearchController上的自帶的View垄琐。所以searchBar不會跟著一起移動边酒。

解決方案:在UIViewController中有以下這個屬性

/*
  Determines which parent view controller's view should be presented over for presentations of type
  UIModalPresentationCurrentContext.  If no ancestor view controller has this flag set, then the presenter
  will be the root view controller.
*/
@property(nonatomic,assign) BOOL definesPresentationContext NS_AVAILABLE_IOS(5_0);

大概是這個屬性確定了那個父控制器的View,將會以優(yōu)先于UIModalPresentationCurrentContext這種呈現(xiàn)方式來展現(xiàn)自己的View狸窘。如果沒有父控制器設(shè)置這一屬性墩朦,那么展示的控制器將會是root view controller。
我們需要將上面那個屬性設(shè)置YES翻擒,告訴系統(tǒng)我們需要將UISearchControoller展示到當(dāng)前的tableViewController上氓涣。

修改代碼:

- (void)loadSearchController {
    _searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
    _searchController.searchResultsUpdater = self;
    _searchController.delegate = self;
    [_searchController.searchBar sizeToFit];
    self.tableView.tableHeaderView = _searchController.searchBar;
    _searchController.dimsBackgroundDuringPresentation = NO;
    // Present 時隱藏導(dǎo)航欄 該屬性默認(rèn)也為YES
    _searchController.hidesNavigationBarDuringPresentation = YES;
    // 增加以下代碼
    self.definesPresentationContext = YES;
}

問題二:

在沒有設(shè)置definesPresentationContext時更改NavigationBar的Translucent屬性,取消半透明效果陋气。在點擊SearchBar劳吠,SearchBar會直接彈出界面如圖一。設(shè)置了definesPresentationContext屬性為YES后巩趁,點擊SearchBar痒玩,會出現(xiàn)各種下移64的問題,如圖二和圖三议慰。

圖二.png
圖三.png
圖四.png

原因:
導(dǎo)航欄的NavigationBar的Translucent屬性默認(rèn)為YES就是默認(rèn)是半透明效果的蠢古,將其改為NO之后,原有的布局會發(fā)生變化别凹。彈出界面的原因是沒有告訴系統(tǒng)我的SearchBarController是放在當(dāng)前控制器中的草讶,加上取消半透明后界面原有的約束發(fā)生了變化,所以searchBar就彈走了炉菲,其實就是向上多偏移了64堕战。第二種情況的是沒有設(shè)置好tableView的contentInset所導(dǎo)致的。

解決方法:
首先像第一個問題一樣加上“self.definesPresentationContext = YES;”拍霜,確保UISearchController是展示在當(dāng)前的UITableViewController上的嘱丢。在設(shè)置tableView的contentInset屬性時,一開始采用的是單純的“self.tableView.contentInset = UIEdgeInsetsZero;”祠饺,就單單這樣寫還是有問題的屿讽,在searchBar成為第一響應(yīng)者的時候,會發(fā)現(xiàn)tableView的位置比你預(yù)期的位置向上偏移了20個像素吠裆,如圖四。

圖五.png

20個像素烂完,這不就是狀態(tài)欄搞的鬼嗎试疙,所以在搜索狀態(tài)的時候tableView應(yīng)該向下偏移20個像素點。判斷是否是處于搜索狀態(tài)可以用UISearchController的active屬性抠蚣。我們也可以把這段代碼放在viewWillLayoutSubviews中祝旷,畢竟是要按照不同的情況設(shè)置不同的contentInset,系統(tǒng)在布局子控件的時候也會調(diào)用這個方法(必須要先super一下)。

增加代碼:

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
    if (self.searchController.isActive) {
        self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);
    } else {
        self.tableView.contentInset = UIEdgeInsetsZero;
    }
}

總結(jié):

上面的內(nèi)容看起來或許有點混亂怀跛,這里基本是有關(guān)布局的問題距贷。
解決的方法都圍繞著“self.definesPresentationContext = YES;”(present控制器展示在當(dāng)前控制器而非默認(rèn)的根控制器)。將導(dǎo)航條半透明屬性設(shè)為NO之后吻谋,將會系統(tǒng)原有的布局忠蝗,想達(dá)到自己的期望需要修改“self.tableView.contentInset”。其實漓拾,這種方法解決的不是很好阁最,在動畫的時候會感覺出contentInset的變化導(dǎo)致tableView瞬移,仔細(xì)看是有一瞬間不足骇两,如果讀者有什么辦法可以解決此問題速种,可以在評論處提一下。(??????)??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末低千,一起剝皮案震驚了整個濱河市配阵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌示血,老刑警劉巖棋傍,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異矾芙,居然都是意外死亡舍沙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門剔宪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拂铡,“玉大人,你說我怎么就攤上這事葱绒「兴В” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵地淀,是天一觀的道長失球。 經(jīng)常有香客問我,道長帮毁,這世上最難降的妖魔是什么实苞? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮烈疚,結(jié)果婚禮上黔牵,老公的妹妹穿的比我還像新娘。我一直安慰自己爷肝,他們只是感情好猾浦,可當(dāng)我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布陆错。 她就那樣靜靜地躺著,像睡著了一般金赦。 火紅的嫁衣襯著肌膚如雪音瓷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天夹抗,我揣著相機(jī)與錄音绳慎,去河邊找鬼。 笑死兔朦,一個胖子當(dāng)著我的面吹牛偷线,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沽甥,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼声邦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了摆舟?” 一聲冷哼從身側(cè)響起亥曹,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恨诱,沒想到半個月后媳瞪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡照宝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年蛇受,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厕鹃。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡兢仰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出剂碴,到底是詐尸還是另有隱情把将,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布忆矛,位于F島的核電站察蹲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏催训。R本人自食惡果不足惜洽议,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漫拭。 院中可真熱鬧绞铃,春花似錦、人聲如沸嫂侍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挑宠。三九已至菲盾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間各淀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留秉溉,地道東北人乒裆。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像奴璃,于是被迫代替她去往敵國和親悉默。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容