Принуждение 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;

Но затем я столкнулся со следующей проблемой: когда я нажимаю на строку поиска, она анимируется, но представленный вид занимает только часть экрана, представленную затемненным хромом сверху и снизу, вместо того, чтобы отображаться в полноэкранном режиме. Размер представленного представления, по-видимому, равен размеру табличного представления, в котором размещена панель поиска, просто центрированная по вертикали на экране. Я не знаю, как переопределить представление результатов поиска, чтобы они отображались в полноэкранном режиме. Я попытался явно установить ModalPresentationStyle как на представленном контроллере представления, так и на представленном, но это не сработало. У меня возникает ощущение, что мне нужно каким-то образом переопределить контроллер представления результатов поиска, но я не знаю, с чего начать, есть идеи?


person Dmitry_G    schedule 29.09.2014    source источник
comment
Вы взглянули на пример кода Apple UICatalog? developer.apple.com/library/ios/samplecode/UICatalog/   -  person Steve Moser    schedule 29.08.2015
comment
Это была одна из первых вещей, которые я сделал, затем спросил на форумах разработчиков Apple и в службе поддержки разработчиков Apple.   -  person Dmitry_G    schedule 29.08.2015


Ответы (1)


Примерно через год использования обходного пути (управление вводом вручную из 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 на мой контроллер представления.

Анимация все еще нуждается в некоторой настройке, но решение работает.

person Dmitry_G    schedule 16.09.2015