UINav Бары и Бары Поиска в iOS 12 - PullRequest
0 голосов
/ 17 октября 2018

У меня старое приложение 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 наэкран.

...