在tableHeaderView中的UISearchController searchBar在屏幕上animation化

我有一个UISearchController与一个UITableViewController作为searchResultsController ,这个searchControllerUISearchBar被设置在我的当前tableView显示在我的根ViewController的tableHeaderView 。 正如所料,几乎所有工作都很顺利。 但在UISearchBar的animation(当我点击searchBar和UINavigationBar隐藏和searchBar到顶部,如在UISearchDisplayController ),我有一个奇怪的行为。 它不是移动到UINavigationBar (y:0)的位置,而是跳出屏幕,并启动显示取消button的animation。 我尝试将我的实例化代码移到viewDidLoad而不是init ,事情是一样的。 我认为问题的核心是在searchResultsController的视图框架,但我不知道(我试图设置框架,没有成功)。 我所做的一切都是纯代码。

这里是代码的相关部分:

  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; 

}

我已经从苹果下载了示例代码,但是它们使用storyBoards和xib作为UITableViewCell,SearchController在项目中完美地工作。 有没有人有同样的问题? 我怎样才能解决这个问题? 任何解决scheme或build议,将不胜感激。

感谢您的关注。

 self.extendedLayoutIncludesOpaqueBars = YES; 

viewDidLoad方法上

您是否尝试将hidesNavigationBarDuringPresentation设置为false? 解决了我的头痛

 self.searchController.hidesNavigationBarDuringPresentation = false; 

把search栏放在导航栏中给我一个更坚实的用户体验(对于iPhone)

 self.navigationItem.titleView = self.searchController.searchBar; 

为了使这个更清晰@洛伦佐的答案为我工作。

 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 // ... } 

SWIFT 3.01

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

我注意到,UISearchController在我的一个观点中完美地工作,但不是另一个。 问题是与UITableViewController而不是UIViewController。 如果你切换到一个UITableView里面有一个UITableView,并且被正确的约束,那就没有问题了。 我用XIB实现了它,它完美地工作。