在tableHeaderView中的UISearchController searchBar在屏幕上animation化
我有一个UISearchController
与一个UITableViewController
作为searchResultsController
,这个searchController
的UISearchBar
被设置在我的当前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实现了它,它完美地工作。