UISearchController
がUITableViewController
であるsearchResultsController
があり、このUISearchBar
のsearchController
は、ルートViewControllerに表示されている現在のtableHeaderView
のtableView
に設定されます。予想通り、ほとんどすべてがうまく機能しています。しかし、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はプロジェクトで完全に機能します。誰も同じ問題を抱えていましたか?どうすれば修正できますか?解決策や提案をいただければ幸いです。
注目してくれてありがとう。
追加
self.extendedLayoutIncludesOpaqueBars = YES;
viewDidLoad
メソッド
HidesNavigationBarDuringPresentationをfalseに設定しようとしましたか?私の頭痛を解決しました。
self.searchController.hidesNavigationBarDuringPresentation = false;
ナビゲーションバーに検索バーを配置すると、私の意見ではより安定したユーザーエクスペリエンスが得られます(iPhoneの場合)
self.navigationItem.titleView = self.searchController.searchBar;
これをより明確にするために、@ Lorenzoの答えは私にとってはうまくいきました。
self.definesPresentationContext = YES;
これを試してください:
まず、委任する必要があります
UISearchControllerDelegate
Swiftの場合
func willPresentSearchController(searchController: UISearchController) {
self.navigationController?.navigationBar.translucent = true
}
func willDismissSearchController(searchController: UISearchController) {
self.navigationController?.navigationBar.translucent = false
}
Swiftで試してください:
override func viewDidLoad() {
edgesForExtendedLayout = []
searchController.hidesNavigationBarDuringPresentation = false
// ...
}
スウィフト3.01
func willPresentSearchController(searchController: UISearchController){
self.navigationController?.navigationBar.isTranslucent = true
}
func willDismissSearchController(searchController: UISearchController) {
self.navigationController?.navigationBar.isTranslucent = false
}
UISearchControllerは私のビューの1つで完全に機能しますが、他のビューでは機能しません。問題はUIViewControllerではなくUITableViewControllerにありました。 UITableViewを内部に持つUIViewControllerに切り替えて適切に制約を設定しても、問題はありません。私はXIBを使用して実装しましたが、完全に機能しました。
私の場合、searchBarはtableHeaderViewにあり、画面にNavigationBarはありませんでした。ただし、アクティブになると、SearchBarは引き続きステータスバーと重なって上方向にアニメーション化します。これを防ぐための解決策は以下を設定することでした:
searchController.hidesNavigationBarDuringPresentation = false
私が言ったようにView ControllerがNavigation Barを使用していなかったので、これは奇妙です。