Ответ 1
Я решил эту проблему, создав UIView с настройками ClipBounds на YES, а затем добавьте subview в свою панель поиска. Затем включите его в заголовок таблицы. его работа сейчас.
Спасибо
У меня проблема с панелью поиска, которая ведет себя странным образом, когда она становится 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;
}
Нормальное состояние
Когда панель поиска становится firstResponder
, она либо перемещается вокруг точки вверх или вниз вниз случайно
И когда панель поиска уходит в отставку, она анимируется, чтобы достичь начала окна, а затем вернуться в свой естественный кадр
Вот пример , воспроизводящий ошибку.
ИЗМЕНИТЬ:
По @kwylez предложение, нежелательная анимация что панель поиска делает, когда она уходит в отставку, можно избежать:
self.searchBar.clipsToBounds = YES;
Я решил эту проблему, создав UIView с настройками ClipBounds на YES, а затем добавьте subview в свою панель поиска. Затем включите его в заголовок таблицы. его работа сейчас.
Спасибо
Вы инициализируете контроллер отображения поиска с помощью панели поиска и контроллера представления, ответственного за управление данными, которые нужно искать. Когда пользователь запускает поиск, контроллер отображения поиска накладывает интерфейс поиска поверх представления диспетчера видных представлений и показывает результаты поиска в виде таблицы.
настроил ваш поисковый запрос
Я проследил проблему с функцией "_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;
Выполнение этого было просто для демонстрации причины проблемы, но удаление этих строк кода отключает любую функциональность, которую вы собираетесь использовать, используя контроллер отображения поиска. Я не знаю точно, что вы надеетесь сделать, поэтому я не могу дать вам никаких советов о том, как действовать, но, надеюсь, я указал вам в правильном направлении относительно причин!