31

我有一个UISearchController带有 a UITableViewControlleras asearchResultsController的,UISearchBarsearchController被设置为tableHeaderView我当前tableView显示在我的根 ViewController 中的。正如预期的那样,几乎一切都运行良好。但是在动画中UISearchBar(当我点击 searchBar 和UINavigationBar隐藏并且 searchBar 到顶部时,如在 中UISearchDisplayController)我有一个奇怪的行为。它没有移动到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;
}

我已经从苹果下载了示例代码,但他们使用 storyBoards 和 UITableViewCell 的 xib,SearchController 在项目中完美运行。有没有人有同样的问题?我怎样才能解决这个问题?任何解决方案或建议将不胜感激。

感谢您的关注。

4

8 回答 8

23

添加

self.extendedLayoutIncludesOpaqueBars = YES;

关于viewDidLoad方法

于 2015-11-06T05:33:59.527 回答
22

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

self.searchController.hidesNavigationBarDuringPresentation = false;

在我看来,将搜索栏放在导航栏中可以提供更可靠的用户体验(对于 iPhone)

self.navigationItem.titleView = self.searchController.searchBar;
于 2014-10-08T05:22:04.193 回答
17

为了更清楚@Lorenzo的回答对我有用。

self.definesPresentationContext = YES;
于 2015-07-20T09:29:32.117 回答
7

试试这个:

首先,您需要委托

UISearchControllerDelegate

对于斯威夫特

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

func willDismissSearchController(searchController: UISearchController) {
    self.navigationController?.navigationBar.translucent = false
}
于 2015-12-16T06:56:49.847 回答
4

在 Swift 中,尝试:

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

    // ...
}
于 2017-01-15T13:50:34.730 回答
1

我注意到 UISearchController 在我的一个视图中完美运行,但在另一个视图中却不行。问题出在 UITableViewController 而不是 UIViewController。如果您切换到内部带有 UITableView 并适当约束的 UIViewController ,则没有问题。我用 XIB 实现了我的,它工作得很好。

于 2016-03-07T23:33:46.450 回答
1

斯威夫特 3.01

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

func willDismissSearchController(searchController: UISearchController) {
self.navigationController?.navigationBar.isTranslucent = false
}
于 2017-01-05T15:00:09.583 回答
0

在我的情况下,searchBar 在 tableHeaderView 中,屏幕上没有 NavigationBar。但是 SearchBar 在变为活动状态时仍会向上动画并与状态栏重叠。防止这种情况的解决方案是设置:

searchController.hidesNavigationBarDuringPresentation = false

这很奇怪,因为正如我所说的视图控制器没有使用导航栏。

于 2018-06-06T15:56:58.607 回答