У меня старое приложение ObjC для iOS 9.3, которое я обновляю до iOS 12 и серии iPhone X.Основное представление - это UIViewController со встроенным UITableView, использующим STCollapseTableView.В таблице есть UISearchController, настроенный с помощью панели поиска с сегментированным элементом управления с кнопками в дополнение к обычным кнопкам textField и Cancel.Таблица изначально смещена вверх на высоту блока поиска, чтобы скрыть его, пока пользователь не перетаскивает таблицу вниз.Все очень ванильно и работало нормально в старых ОС.
Теперь: Первоначальное отображение таблицы в порядке на ViewDidLoad & Appear.Первоначальное перетаскивание таблицы работает, и панель поиска отображает только текстовое поле и кнопку отмены по желанию.Первая проблема: касание текстового поля, чтобы получить фокус, перемещает текстовое поле записи поиска и кнопку отмены вверх, рисует сегментированный элемент управления, как требуется, под ними, а затем перемещает всю панель поиска вверх в область навигации примерно на высоту панели поиска плюс кнопки.Это отделяет tableView от панели поиска, заполняющей фоновые пробелы.На этом этапе кнопка отмены все еще работает, и ее действие перемещает представление таблицы обратно на панель поиска.
Функции ввода текста и поиска и ограничения по-прежнему работают нормально и заполняют представление таблицы соответствующим образом.
Вторая БОЛЬШАЯ проблема: после того, как пользователь выбирает подробный вид из результатов поиска и возвращается к основному табличному виду, панель поиска теперь смещена дальше вверх внутри строки навигации / состояния с (iPhoneX) текстовым полем под надрезом и кнопкой «Отмена» подсостояние батареи и неприкосновенность или iPhone8 с панелью поиска, едва видимой в верхней части экрана, далеко за пределами безопасной зоны.Это смещение происходит на устройствах iOS 12, но не на устройствах iOS 10.3.3.
Вот соответствующий код: определение контроллера поиска в MainVC
// Here's where we create our UISearchController
self.MySearchResultsController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.MySearchResultsController.searchResultsUpdater = self;
self.MySearchResultsController.searchBar.delegate = self;
UITextInputAssistantItem* item = [self.MySearchResultsController inputAssistantItem];
item.leadingBarButtonGroups = @[];
item.trailingBarButtonGroups = @[];
self.MySearchResultsController.searchBar.scopeButtonTitles = @[@"",@"",@"",@""];
id temp = [UISegmentedControl appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]];
UIImage * img = [UIImage imageNamed:@""];
[temp setImage:img forSegmentAtIndex: 1];
img = [UIImage imageNamed:@""];
[temp setImage:img forSegmentAtIndex: 3];
img = [UIImage imageNamed:@""];
[temp setImage:img forSegmentAtIndex: 2];
self.MySearchResultsController.searchBar.showsScopeBar = YES;
self.MySearchResultsController.searchBar.keyboardType = UIKeyboardTypeASCIICapable;
[self.MySearchResultsController.inputAccessoryView reloadInputViews];
[self.MySearchResultsController.searchBar sizeToFit];
// Add the UISearchBar to the top header of the table view
self.tableView.tableHeaderView = self.MySearchResultsController.searchBar;
// Hides search bar initially. When the user pulls down on the list, the search bar is revealed.
[self.tableView setContentOffset:CGPointMake(0, self.MySearchResultsController.searchBar.frame.size.height)];
// It is usually good to set the presentation context.
self.definesPresentationContext = YES;
self.MySearchResultsController.obscuresBackgroundDuringPresentation = NO;
self.MySearchResultsController.dimsBackgroundDuringPresentation = NO;
if (@available(iOS 11.0, *)) {
self.navigationController.navigationItem.searchController = _MySearchResultsController;
self.navigationController.navigationItem.hidesSearchBarWhenScrolling = false;
[self.MySearchResultsController setActive:YES];
} else {
self.tableView.tableHeaderView = self.MySearchResultsController.searchBar;
// [self presentSearchController:_MySearchResultsController];
}
Также в Main TableVC происходит отмоткаиз detailVC
-(IBAction)unwindFromNewDetailViewController:(UIStoryboardSegue *) segue {
NewDetailViewController *dVC = [segue sourceViewController];
NSIndexPath *newPath = dVC.returningIndexPath;
if (newPath == nil) {
newPath = [NSIndexPath indexPathForRow:(NSInteger)0 inSection:(NSInteger)0];
}
if (_inFilterMode) {
newPath = _selectedIndexPath;
[self.tableView setContentOffset:CGPointMake(0, self.MySearchResultsController.searchBar.frame.size.height)];
}
[self.tableView reloadData];
[self.tableView openSection:newPath.section animated:YES];
[self.tableView scrollToRowAtIndexPath:newPath
atScrollPosition:UITableViewScrollPositionMiddle
animated:YES];
}
и вот ответ от DetailVC: viewWillDisappear {}
if (_inSearchMode) {
p = [NSIndexPath indexPathForRow:(NSInteger)0 inSection:(NSInteger)0];
}
[self performSegueWithIdentifier:@"unwindNewDetailToMainTable" sender:self];
[super viewWillDisappear:YES];
Буду признателен за любые мысли о моем неправильном кодировании или о том, как принудительно изменить положение searchBar и navBar наэкран.