强制UISearchController显示搜索结果表全屏

时间:2014-09-29 15:22:30

标签: objective-c ios8 uisearchcontroller

我有一个UIViewController,里面有Segmented Control和UITableView。 全部使用在故事板中设置的Autolayout。这是我在那里设置的约束的代码版本:

H:|-[SegmentedControls]-| 
H:|[TableView]|
V:|-[SegmentedControls]-[TableView]|

我已将UISearchController和UISearchbar添加为表的标题视图。 为了显示搜索结果,我创建了一个新的UITableViewController。

UITableViewController *searchResultsController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];
searchResultsController.tableView.dataSource = self;
searchResultsController.tableView.delegate = self;

self.searchController = [[UISearchController alloc] initWithSearchResultsController:searchResultsController];
self.searchController.delegate = self;
self.searchController.searchResultsUpdater = self;
self.searchController.searchBar.frame = CGRectMake(self.searchController.searchBar.frame.origin.x, self.searchController.searchBar.frame.origin.y, self.searchController.searchBar.frame.size.width, 44.0);
self.clientListTable.tableHeaderView = self.searchController.searchBar;
self.searchController.searchBar.scopeButtonTitles = @[@"Active", @"Inactive"];
self.definesPresentationContext = YES;

但后来我遇到了以下问题 - 当我按下搜索栏时,它会动画,但所呈现的视图只占用屏幕的一部分,在顶部和底部呈现暗淡的铬色,而不是全屏显示。 呈现视图的大小似乎等于其中一个tableview,它主持搜索栏,只是在屏幕上垂直居中。 我对如何覆盖搜索结果的呈现方式一无所知,使它们全屏显示。我试图在呈现视图控制器和呈现的视图控制器上明确设置 ModalPresentationStyle ,但它没有工作。 我感觉我需要以某种方式覆盖搜索结果的演示控制器,但我不知道从哪里开始,有什么想法?

1 个答案:

答案 0 :(得分:0)

使用解决方法大约一年后(手动管理来自UISearchBar的输入,没有UISearchController),我找到了一个解决方案。 SearchController在一个新表中显示一个包含结果的表,该表设置为与调用它的表相同的大小。因为我的表只是视图的一部分,所以提供的表也不是全屏。 我有错误,是我确实试图隐藏分段控件,但我没有更新约束(当时自动布局仍然不是很好)。因此,在观看今年WWDC关于“汽车布局之谜”的演讲之后,我想出了一个解决方案:

    -(void)willPresentSearchController:(UISearchController *)searchController {

[UIView animateWithDuration:0.5
                      delay:0.0
                    options: UIViewAnimationOptionCurveEaseInOut
                 animations:^(void) {
                     [NSLayoutConstraint deactivateConstraints:@[_constraintToTheSegmentalControls,_constraintToTheTop]];
                     [NSLayoutConstraint activateConstraints:@[_constraintToTheTop]];
                     self.segmentedControls.hidden = YES;
                 }
                 completion:NULL];
}

   -(void)didDismissSearchController:(UISearchController *)searchController {

[UIView animateWithDuration:0.5
                      delay:0.0
                    options: UIViewAnimationOptionCurveEaseInOut
                 animations:^(void) {
                     [NSLayoutConstraint deactivateConstraints:@[_constraintToTheSegmentalControls,_constraintToTheTop]];
                     [NSLayoutConstraint activateConstraints:@[_constraintToTheSegmentalControls]];
                     self.segmentedControls.hidden = NO;
                 }
                 completion:NULL];
}

约束“constraintToTheSegmentalControls”是从表格视图顶部到分段控件底部的约束,默认情况下是活动的。 约束“constraintToTheTop”是从表视图顶部到顶部布局指南的约束,默认情况下是非活动的。 我将它们都添加为我对视图控制器的IB引用。

动画仍需要一些调整,但解决方案正在发挥作用。