展开以查看搜索结果控制器活动在顶部留下黑色间隙

时间:2015-07-09 05:20:46

标签: ios objective-c ios8 uisearchcontroller

我有多个视图控制器都使用一个类(我们称之为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);

还有UISearchBarUISearchController的常用委托方法,以及显示搜索栏的代码,该搜索栏使用动画替换导航栏的titleView。

如何在退回搜索结果后摆脱这个差距?

1 个答案:

答案 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错误。