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