UISearchController searchBar в tableHeaderView, анимация вне экрана

У меня есть UISearchController с UITableViewController как searchResultsController, UISearchBar этого searchController настроено на tableHeaderView моего текущего tableView, отображаемого в моем корневом ViewController. Почти все работает хорошо, как и ожидалось. Но в анимации UISearchBar (когда я нажимаю на панель поиска, и UINavigationBar скрывается, а панель поиска поднимается вверх, как в UISearchDisplayController), у меня странное поведение. Вместо того, чтобы перейти к позиции UINavigationBar (y: 0), он выпрыгивает из экрана и запускает анимацию, которая показывает кнопку отмены. Я попытался переместить свой код создания экземпляра в viewDidLoad вместо init, и все осталось точно так же. Я думаю, что центр проблемы находится в рамке вида searchResultsController, но я не уверен в этом (я пытался установить рамку, но безуспешно). Все, что я делаю, находится в чистом коде.

Вот соответствующая часть кода:

- (void) viewDidLoad { 
    [super viewDidLoad];

    // search controller setup
    self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.searchResultsController];
    self.searchController.delegate = self;
    self.searchController.searchResultsUpdater = self;
    self.searchController.searchBar.delegate = self;

    [self.searchController.searchBar sizeToFit];
    self.tableView.tableHeaderView = self.searchController.searchBar;

    self.searchController.definesPresentationContext = YES;
}

И у меня есть ленивая загрузка для searchResultsController:

- (UITableViewController *)searchResultsController {
    if (_searchResultsController == nil) {
        _searchResultsController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];
        _searchResultsController.tableView.delegate = self;
        _searchResultsController.tableView.dataSource = self;
    }
    return _searchResultsController;
}

Я скачал пример кода с Apple, но они используют StoryBoards и xib для UITableViewCell, SearchController отлично работает в проекте. У кого-нибудь была такая же проблема? Как я могу это исправить? Любые решения или предложения будут оценены.

Спасибо за внимание.


person Tiago Maia    schedule 06.10.2014    source источник
comment
Вы когда-нибудь разбирались в этом вопросе? В настоящее время имею аналогичную проблему с моей строкой поиска.   -  person Lorenzo    schedule 04.01.2015
comment
Нет, Лоренцо. К сожалению, я использовал устаревший API для этой проблемы. С раскадровками, кажется, работает хорошо (я попробовал пример приложения от Apple), но в коде я получил эту странную ошибку.   -  person Tiago Maia    schedule 05.01.2015
comment
Хорошо все равно спасибо. Не могли бы вы рассказать о методе, который вы использовали, который работал? Я также смотрел на пример Apple, и они используют раскадровки для таблицы и подробного представления, но все компоненты панели поиска выполняются в коде, это то, что вы сделали?   -  person Lorenzo    schedule 05.01.2015
comment
Не берите в голову! Я только что заметил, что пропустил строку self.definesPresentationContext = YES;, которая оказалась решающей.   -  person Lorenzo    schedule 05.01.2015
comment
Посмотрите, поможет ли эта предыдущая ветка: #28373171" title="uisearchbar, представленный uisearchcontroller в представлении заголовка таблицы, тоже анимирует"> stackoverflow.com/questions/28326269/   -  person Brian Sachetta    schedule 10.03.2015


Ответы (8)


Добавлять

self.extendedLayoutIncludesOpaqueBars = YES;

по методу viewDidLoad

person dexcell    schedule 06.11.2015
comment
Работа с UITableViewController вместе с UISearchController устранила эту проблему для меня. - person Senry; 26.05.2016

Вы пытались установить для hidesNavigationBarDuringPresentation значение false? Решил мою головную боль..

self.searchController.hidesNavigationBarDuringPresentation = false;

По моему мнению, размещение панели поиска в панели навигации дает более надежный пользовательский интерфейс (для iphone)

self.navigationItem.titleView = self.searchController.searchBar;
person Piet Grootnoten    schedule 08.10.2014
comment
Удивительно, это именно то, что я искал, большое спасибо. Действительно, панель поиска должна быть на панели навигации. - person Vincent Dondain; 24.07.2015
comment
Это сработало и для меня, спасибо! Очевидный вопрос: почему? - person Dan; 29.09.2015
comment
У меня тоже сработало! Спасибо. Пример с яблоком даже не говорит об этом варианте. - person CF_Maintainer; 19.10.2015
comment
У меня был UIView в качестве контейнера для панели поиска, между панелью навигации и табличным представлением результатов. Мне пришлось установить self.definesPresentationContext на false, чтобы контейнер не прыгал вниз примерно на 44 пикселя при активации панели поиска. - person Echelon; 25.02.2016
comment
self.searchController.hidesNavigationBarDuringPresentation = false; исправил это и для меня! Благодарю вас! - person Jonathan Brown; 25.02.2016
comment
Идеально .. сработало для меня ..! Я добавил панель поиска в заголовок navigationItem. - person christijk; 16.11.2016

Чтобы сделать это более понятным, ответ @Lorenzo сработал для меня.

self.definesPresentationContext = YES;
person Cedrick    schedule 20.07.2015
comment
Мужик ты мой герой дня! - person Perjan Duro; 29.01.2016
comment
У меня сработало наоборот! У меня был UIView в качестве контейнера для панели поиска, между панелью навигации и табличным представлением результатов. Мне пришлось установить self.definesPresentationContext на false, чтобы контейнер не прыгал вниз примерно на 44 пикселя при активации панели поиска. - person Echelon; 25.02.2016

Попробуйте это:

Сначала нужно делегировать

UISearchControllerDelegate

Для Swift

func willPresentSearchController(searchController: UISearchController) {
    self.navigationController?.navigationBar.translucent = true
}

func willDismissSearchController(searchController: UISearchController) {
    self.navigationController?.navigationBar.translucent = false
}
person Inuyasha    schedule 16.12.2015

В Swift попробуйте:

override func viewDidLoad() {
    edgesForExtendedLayout = []
    searchController.hidesNavigationBarDuringPresentation = false

    // ...
}
person xandrefreire    schedule 15.01.2017

Я заметил, что UISearchController отлично работает в одном из моих представлений, но не в другом. Проблема была с UITableViewController, а не с UIViewController. Если вы переключитесь на UIViewController с UITableView внутри него и должным образом ограничены, проблем не возникнет. Я реализовал свой с помощью XIB, и он работал отлично.

person Aaron    schedule 07.03.2016
comment
Этот комментарий привел меня в правильном направлении, чтобы решить мою проблему. Ограничения, описанные в варианте B этого ответа SO, исправили мою проблему: stackoverflow.com/a/52300159/4704303 - person Monica Granbois; 23.07.2019

СВИФТ 3.01

func willPresentSearchController(searchController: UISearchController){
self.navigationController?.navigationBar.isTranslucent = true
}

func willDismissSearchController(searchController: UISearchController) {
self.navigationController?.navigationBar.isTranslucent = false
}
person Yaroslav Dukal    schedule 05.01.2017

В моем случае панель поиска находилась в tableHeaderView, а панели навигации на экране не было. Но SearchBar по-прежнему анимировался вверх, перекрывая строку состояния, когда становился активным. Решение для предотвращения этого состояло в том, чтобы установить:

searchController.hidesNavigationBarDuringPresentation = false

Что странно, потому что, как я уже сказал, контроллер представления не использует панель навигации.

person agilityvision    schedule 06.06.2018