web-dev-qa-db-ja.com

画面外にアニメーションするtableHeaderViewのUISearchController searchBar

UISearchControllerUITableViewControllerであるsearchResultsControllerがあり、このUISearchBarsearchControllerは、ルートViewControllerに表示されている現在のtableHeaderViewtableViewに設定されます。予想通り、ほとんどすべてがうまく機能しています。しかし、UISearchBarのアニメーション(UINavigationBarのように、searchBarをクリックしてUISearchDisplayControllerが非表示になり、searchBarが先頭に移動すると)奇妙な動作をします。 UINavigationBarの位置(y:0)に移動する代わりに、画面から飛び出し、キャンセルボタンを表示するアニメーションを開始します。インスタンス化コードをviewDidLoadではなくinitに移動しようとしましたが、まったく同じです。問題の中心はsearchResultsControllerのビューのフレーム内にあると思いますが、それについてはわかりません(成功せずにフレームを設定しようとしました)。私がしていることはすべて純粋なコードです。

コードの関連部分は次のとおりです。

- (void) viewDidLoad { 
    [super viewDidLoad];

    // search controller setup
    self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.searchResultsController];
    self.searchController.delegate = self;
    self.searchController.searchResultsUpdater = self;
    self.searchController.searchBar.delegate = self;

    [self.searchController.searchBar sizeToFit];
    self.tableView.tableHeaderView = self.searchController.searchBar;

    self.searchController.definesPresentationContext = YES;
}

そして、searchResultsControllerの遅延ロードがあります:

- (UITableViewController *)searchResultsController {
    if (_searchResultsController == nil) {
        _searchResultsController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];
        _searchResultsController.tableView.delegate = self;
        _searchResultsController.tableView.dataSource = self;
    }
    return _searchResultsController;
}

Appleからサンプルコードをダウンロードしましたが、storyBoardsとUITableViewCellのxibを使用しているため、SearchControllerはプロジェクトで完全に機能します。誰も同じ問題を抱えていましたか?どうすれば修正できますか?解決策や提案をいただければ幸いです。

注目してくれてありがとう。

30
Tiago Maia

追加

self.extendedLayoutIncludesOpaqueBars = YES;

viewDidLoadメソッド

23
dexcell

HidesNavigationBarDuringPresentationをfalseに設定しようとしましたか?私の頭痛を解決しました。

self.searchController.hidesNavigationBarDuringPresentation = false;

ナビゲーションバーに検索バーを配置すると、私の意見ではより安定したユーザーエクスペリエンスが得られます(iPhoneの場合)

self.navigationItem.titleView = self.searchController.searchBar;
21
Piet Grootnoten

これをより明確にするために、@ Lorenzoの答えは私にとってはうまくいきました。

self.definesPresentationContext = YES;
17
Cedrick

これを試してください:

まず、委任する必要があります

UISearchControllerDelegate

Swiftの場合

func willPresentSearchController(searchController: UISearchController) {
    self.navigationController?.navigationBar.translucent = true
}

func willDismissSearchController(searchController: UISearchController) {
    self.navigationController?.navigationBar.translucent = false
}
7
Inuyasha

Swiftで試してください:

override func viewDidLoad() {
    edgesForExtendedLayout = []
    searchController.hidesNavigationBarDuringPresentation = false

    // ...
}
4
XFreire

スウィフト3.01

func willPresentSearchController(searchController: UISearchController){
self.navigationController?.navigationBar.isTranslucent = true
}

func willDismissSearchController(searchController: UISearchController) {
self.navigationController?.navigationBar.isTranslucent = false
}
1
Maksim Kniazev

UISearchControllerは私のビューの1つで完全に機能しますが、他のビューでは機能しません。問題はUIViewControllerではなくUITableViewControllerにありました。 UITableViewを内部に持つUIViewControllerに切り替えて適切に制約を設定しても、問題はありません。私はXIBを使用して実装しましたが、完全に機能しました。

1
Aaron

私の場合、searchBarはtableHeaderViewにあり、画面にNavigationBarはありませんでした。ただし、アクティブになると、SearchBarは引き続きステータスバーと重なって上方向にアニメーション化します。これを防ぐための解決策は以下を設定することでした:

searchController.hidesNavigationBarDuringPresentation = false

私が言ったようにView ControllerがNavigation Barを使用していなかったので、これは奇妙です。

0
agilityvision