我有多个视图控制器都使用一个类(我们称之为searchClass
<NSObject>
)我写了一个UISearchController
来搜索外部API。用户可以点击搜索图标,搜索控制器变为活动状态:[_searchClass.searchController setActive:YES];
它使用自己的表视图控制器(不是每个视图控制器中的控制器,因为它们不是所有的表视图控制器)。
在我的情况下,我让搜索栏出现在导航栏中。搜索效果很好,用户可以选择搜索结果并点按它以获取详细信息视图。 问题是当用户从详细信息视图返回(展开)到搜索结果时,有一个约44磅高的黑色间隙,短暂出现在表格视图上方和导航栏下方,并且然后就消失了。
这是我的设置。在视图控制器中:
self.definesPresentationContext = YES;
_searchClass = [SearchClass new];
_searchClass.navController = [self navigationController];
在搜索类中:
_searchTableViewController = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"searchTableViewController"];
_searchTableViewController.tableView.delegate = self;
_searchTableViewController.tableView.dataSource = self;
_searchTableViewController.tableView.backgroundColor = [UIColor clearColor];
_searchTableViewController.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
_searchTableViewController.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
_searchTableViewController.definesPresentationContext = YES;
_searchController = [[UISearchController alloc] initWithSearchResultsController:_searchTableViewController];
_searchController.delegate = self;
_searchController.hidesNavigationBarDuringPresentation = NO;
_searchController.searchBar.delegate = self;
_searchController.searchBar.searchBarStyle = UISearchBarStyleMinimal;
_searchController.searchBar.showsCancelButton = YES;
_searchController.searchBar.frame = CGRectMake(self.searchController.searchBar.frame.origin.x, self.searchController.searchBar.frame.origin.y, self.searchController.searchBar.frame.size.width, 44.0);
还有UISearchBar
和UISearchController
的常用委托方法,以及显示搜索栏的代码,该搜索栏使用动画替换导航栏的titleView。
如何在退回搜索结果后摆脱这个差距?
答案 0 :(得分:2)
我找到了解决方案,它与UINavigationBar
有关。出于某种原因,将半透明属性设置为NO
似乎已导致此问题。
self.navigationBar.translucent = YES;
将其设置为YES
(或省略该行,因为它是默认值)使其正常工作。由于我仍然希望导航栏不透明,我做了以下操作,使导航栏只在转换期间半透明,这似乎是问题所在:
- (void) viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
self.navigationController.navigationBar.translucent = YES;
}
-(void) viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
self.navigationController.navigationBar.translucent = NO;
}
对我来说,绝对看起来像是一个真正的iOS错误。