2014-01-07 5 views
11

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

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

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 up Point down



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

Stretching up

Reaching origin

Описание: sample project Воспроизведение ошибки.

EDIT:

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

self.searchBar.clipsToBounds = YES; 
+0

Добавление вашего SearchBar как подвид зрения на ViewController, вместо того, как tableHeader в Tableview в фиксирует вверх/вниз движение, если оно не должно быть tableHeader. –

+0

Это правда, но у меня есть контент за табличным представлением, который нужно показать, когда пользователь прокручивает ... Я могу вернуться к решению, хотя, если ничего не найду. – Moxy

+0

проверить мой ответ – codercat

ответ

-1

Я проследил вопрос к функции «_layoutSidePanels» в JASidePanelController.

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

rootViewController.shouldResizeLeftPanel = YES; 

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

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

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

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

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

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

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

+1

Проблема, как вы заявили, определенно 'UISearchDisplayController', которая имеет эту ошибку даже в примере кода Apple. Анимация «конфликт» с JASidePanels разрешается путем отсечения до границ. – Moxy

+0

Если бы мой ответ помог, одобрение было бы весьма признательным! :) – Mike

+0

Ваш ответ указывает, где проблема, но не решая ее. Перед тем, как вы ответили, у меня было ограничение на клики (проверьте мое редактирование). Я бы с удовольствием одобрил ваш, если вы изменили его, и он решает проблему :) – Moxy

0

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

настроить ваш взгляд SearchBar

Fixed - UISearchBar-bug-master

+0

Вы только меняли цвета (надеюсь, что я чего-то не пропущу). Разрыв по-прежнему показывает фон в виде таблицы (один раз каждые 2 раза), прежде чем вводить – Moxy

+0

контроллер отображения поиска накладывает интерфейс поиска на представление исходного представления. Прочтите apple doc – codercat

+1

Я знаю, но он не должен оставлять этот пробел. Это не в iOS 6. У UISearchDisplayController есть много ошибок в iOS 7, но нужно использовать его. Я ищу решение для изменения своего поведения для этого случая. Я высоко ценю усилия и буду более чем счастлив принять ответ (и даже присудить еще одну награду, поскольку этот уже заканчивается), но в этом случае заявить, где проблема, не решает ее. – Moxy

7

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

Благодаря

Смежные вопросы