IOS 8の新しいUISearchController
を使用して、UISearchBar
にそのUINavigationBar
を埋め込みます。次のように簡単に実行できます。
searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.delegate = self
searchController.searchBar.delegate = self
searchController.dimsBackgroundDuringPresentation = false
searchController.hidesNavigationBarDuringPresentation = false
navigationItem.titleView = searchController.searchBar
しかし、スコープボタンを追加すると:
searchController.searchBar.showsScopeBar = true
searchController.searchBar.scopeButtonTitles = ["Posts, Users, Subreddits"]
UISearchBar
の後ろにボタンを追加し、明らかに非常に奇妙に見えます。
どうすればいいですか?
scopeBar
がアクティブでない場合、searchController
が非表示になると予想される「設計の問題」にぶつかっています。
スコープバーのボタンは、検索バーがアクティブになったときの位置であり、ナビゲーションバーに移動するため、検索バーの後ろ(下)に表示されます。
検索がアクティブでない場合、表示されるスコープバーは画面上のスペースを占有し、コンテンツから気を散らし、ユーザーを混乱させます(スコープボタンにはフィルタリングする結果がないため)。
searchBar
は既にtitleViewにあるため、スコープバーを表示する(ナビゲーションと検索)バーアニメーションは発生しません。
searchBar
がアクティブになったときにタイトル領域までアニメーション化することです。ナビゲーションバーは高さをアニメーション化し、非表示にされたスコープバーを含めるスペースを確保します。これはすべて検索コントローラーによって処理されます。2番目のオプションは、ほとんど同じくらい簡単ですが、Searchバーボタンアイコンを使用することです。これにより、searchBar
およびscopeBar
がナビゲーションバーの上に表示されます。
- (IBAction)searchButtonClicked:(UIBarButtonItem *)__unused sender {
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.searchResultsUpdater = self;
self.searchController.hidesNavigationBarDuringPresentation = NO;
self.searchController.dimsBackgroundDuringPresentation = NO;
self.definesPresentationContext = YES;
self.searchController.searchBar.scopeButtonTitles = @[@"Posts", @"Users", @"Subreddits"];
[self presentViewController:self.searchController animated:YES completion:nil];
}
searchBar
をtitleViewに残したい場合、必要なことを行うアニメーションは組み込まれていません。NavigationBarの高さの変更を処理し、独自のスコープバーを表示する(または内部にフックする)ために独自のコードをロールする必要があります、組み込みのscopeBar
をアニメーション化して表示します)。
幸運なら、誰かがwillPresentSearchController:
必要な遷移を処理するコード。
searchBar
とscopeBar
を常に表示したい場合は、おそらく組み込みのscopeBar
を使用して、検索コントローラーがアクティブでない場合でもユーザーが常に表示するUISegmentedControl
に置き換える必要があります。
更新:
この回答 は、UISearchController
をサブクラス化して、searchBarの高さを変更することを提案しました。