web-dev-qa-db-ja.com

UISearchBarがナビゲーションバーにあり、スコープボタンがあるiOS 8でUISearchControllerを使用するにはどうすればよいですか?

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の後ろにボタンを追加し、明らかに非常に奇妙に見えます。

どうすればいいですか?

28
Doug Smith

scopeBarがアクティブでない場合、searchControllerが非表示になると予想される「設計の問題」にぶつかっています。

スコープバーのボタンは、検索バーがアクティブになったときの位置であり、ナビゲーションバーに移動するため、検索バーの後ろ(下)に表示されます。

検索がアクティブでない場合、表示されるスコープバーは画面上のスペースを占有し、コンテンツから気を散らし、ユーザーを混乱させます(スコープボタンにはフィルタリングする結果がないため)。

searchBarは既にtitleViewにあるため、スコープバーを表示する(ナビゲーションと検索)バーアニメーションは発生しません。

  • easiestオプションは、ナビゲーションバーの下に検索バーを配置し、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:必要な遷移を処理するコード。

  • searchBarscopeBarを常に表示したい場合は、おそらく組み込みのscopeBarを使用して、検索コントローラーがアクティブでない場合でもユーザーが常に表示するUISegmentedControlに置き換える必要があります。

更新:

この回答 は、UISearchControllerをサブクラス化して、searchBarの高さを変更することを提案しました。

22
user4151918