UITableView с UISearchController переходит под панель навигации при входе в результирующее представление и возвращается

У меня есть UITableView с панелью поиска UISearchController в UINavigationBar, все работает отлично, но когда я нажимаю результат результатов поиска UISearchController, и я возвращаюсь, UITableView находится под NavBar, так я инициализирую UISearchController:

        self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
        self.searchController.delegate = self;
        self.searchController.searchResultsUpdater = self;

        self.searchController.searchBar.delegate = self;
        self.searchController.dimsBackgroundDuringPresentation = NO;
        self.searchController.hidesNavigationBarDuringPresentation = NO;
        self.searchController.searchBar.placeholder = NSLocalizedString(@"Local Search", @"");
        self.searchController.searchBar.frame = CGRectMake(0, -5, [UIScreen mainScreen].bounds.size.width, 44);


        ctrl = [[UIView alloc] initWithFrame:CGRectMake(0, 0,[UIScreen mainScreen].bounds.size.width, 44)];
        ctrl.backgroundColor = [UIColor clearColor];
        ctrl.autoresizingMask = UIViewAutoresizingFlexibleWidth;
        [ctrl addSubview:self.searchController.searchBar];
        self.navigationItem.titleView = ctrl;
        self.definesPresentationContext = YES;

Строка поиска отлично отображается в UINavigationBar, затем, когда я что-то ищу, и я нажимаю контроллер представления для одного результата следующим образом:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
    DetailListController *detailList = [[DetailListController alloc] init];
    [self.navigationController pushViewController:detailList animated:YES];
}

когда я вернусь к UITableView, сделав это:

[self.navigationController popViewControllerAnimated:YES];

UITableView находится под UINavigationBar, как я могу это исправить?

спасибо

Ответ 1

У меня была точно такая же проблема, установка extendedLayoutIncludesOpaqueBars в YES/true в контроллер просмотра, представляющий контроллер поиска, кажется, исправляет его.

self.extendedLayoutIncludesOpaqueBars = YES

В качестве предостережения: установка этого свойства изменяет значение сдвига вертикального содержимого прокрутки.

Ответ 2

Это очень неприятная ошибка в UIKit. То, что, по-видимому, происходит, состоит в том, что верхнее руководство по планированию представления представления выглядит reset до 0, то есть теперь оно находится под навигационной панелью. Руководство по планированию - это свойство только для чтения, поэтому вы не можете его исправить, отредактировав его напрямую. Тем не менее, я придумал взломать его до reset до правильного значения. Добавьте это в свой UISearchControllerDelegate:

- (void)didDismissSearchController:(UISearchController *)searchController
{
    UINavigationController *nav = self.navController; // you muse save this earlier

    // force to layout guide to reset by pushing a dummy controller and popping it right back
    [nav pushViewController:[UIViewController new] animated:NO];
    [nav popViewControllerAnimated:NO];
}

Ответ 3

Что помогло мне в том, чтобы создать собственное ограничение компоновки

tableView.top <-> tableView.superview.top

вместо обычно используемого

tableView.top <-> tableView.superview.topLayoutGuide

и установка

view.edgesForExtendedLayout = .Top

Я пробовал бесчисленные комбинации макетов и ограничений и ничего не работал, кроме этого. Действительно раздражающая ошибка