UISearchBar автоматически изменяет размеры и изменяет рамки

У меня проблема с панелью поиска, которая ведет себя странным образом, когда она становится firstResponder и когда она уходит в отставку.

Строка поиска добавляется как заголовок представления таблицы

self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.view.frame.size.width, 44.0f)];
self.searchBar.translucent = NO;
self.searchBar.barTintColor = [UIColor grayColor];
self.tableView.tableHeaderView = self.searchBar;

self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar
                                                          contentsController:self];
self.searchController.searchResultsDataSource = self;

Контроллер представления устанавливает левую панель JASidePanelController, и она скрывает центральную панель, когда клавиатура показывает или скрывает:

- (void)keyboardWillAppear:(NSNotification *)note
{
    [self.sidePanelController setCenterPanelHidden:YES
                                          animated:YES
                                          duration:[[note.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
    self.searchBar.showsCancelButton = YES;
}

- (void)keyboardWillDisappear:(NSNotification *)note
{
    [self.sidePanelController setCenterPanelHidden:NO
                                          animated:YES
                                          duration:[[note.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
    self.searchBar.showsCancelButton = NO;
}

Нормальное состояние Normal state

Когда панель поиска становится firstResponder, она либо перемещается вокруг точки вверх или вниз вниз случайно

Point upPoint down



И когда панель поиска уходит в отставку, она анимируется, чтобы достичь начала окна, а затем вернуться в свой естественный кадр

Stretching up

Reaching origin

Вот пример , воспроизводящий ошибку.

ИЗМЕНИТЬ:

По @kwylez предложение, нежелательная анимация что панель поиска делает, когда она уходит в отставку, можно избежать:

self.searchBar.clipsToBounds = YES;

Ответ 1

Я решил эту проблему, создав UIView с настройками ClipBounds на YES, а затем добавьте subview в свою панель поиска. Затем включите его в заголовок таблицы. его работа сейчас.

Спасибо

Ответ 2

Вы инициализируете контроллер отображения поиска с помощью панели поиска и контроллера представления, ответственного за управление данными, которые нужно искать. Когда пользователь запускает поиск, контроллер отображения поиска накладывает интерфейс поиска поверх представления диспетчера видных представлений и показывает результаты поиска в виде таблицы.

настроил ваш поисковый запрос

Исправлено - UISearchBar-error-master

Ответ 3

Я проследил проблему с функцией "_layoutSidePanels" в JASidePanelController.

В делегате приложения я прокомментировал следующий код, и, похоже, он увеличил и уменьшил серое представление.

rootViewController.shouldResizeLeftPanel = YES;

Если вы выполните код, когда выбрана поисковая панель, вы вызываете setCenterPanelHidden, который впоследствии вызывает _layoutSidePanels, который запускает следующий код:

if (self.leftPanel.isViewLoaded) {
    CGRect frame = self.leftPanelContainer.bounds;
    if (self.shouldResizeLeftPanel) {
        frame.size.width = self.leftVisibleWidth;
    }
    self.leftPanel.view.frame = frame;
}

Изменение рамки боковой панели, по-видимому, является причиной, и, как я уже сказал, комментирование этого кода устраняет проблему на моем конце.

Изменить: также сначала казалось, что панель поиска двигалась вверх и вниз, но при дальнейшем осмотре кажется, что она всегда немного под навигационной панелью, но вы ее не заметите, пока не выберете панель поиска и остальная часть вида "серых" выходит, так что небольшое пространство, которое было белым между синей навигационной панелью и светло-серой полосой поиска, становится темно-серым, как и остальная часть таблицы ниже.

Редактировать # 2: Взял меня немного, но мне удалось выяснить, где чертовски появилась серая маска. Ваш UISearchDisplayController - это то, что отвечает за сероватый фон, который появляется, когда панель поиска становится первым ответчиком, и когда я удалил следующие две строки кода, проблема, которую вы видели, исчезла:

self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self];
self.searchController.searchResultsDataSource = self;

Выполнение этого было просто для демонстрации причины проблемы, но удаление этих строк кода отключает любую функциональность, которую вы собираетесь использовать, используя контроллер отображения поиска. Я не знаю точно, что вы надеетесь сделать, поэтому я не могу дать вам никаких советов о том, как действовать, но, надеюсь, я указал вам в правильном направлении относительно причин!