2016-01-29 1 views
7

Хорошо, я потратил на это 8 часов без везения.UISearchController Search Bar Position Drops 64 балла

Панель поиска появляется ровно 64 очков слишком низко:

enter image description here

Все остальные кадры точно правильно.

Редактировать: - Это вид UISearchController, который вызывает ошибку origin.y. Он получает значение 64, когда оно должно быть 0. Если добавить этот метод:

- (void)didPresentSearchController:(UISearchController *)searchController 
{ 
    [super didPresentSearchController:searchController]; 
    searchController.view.frame = CGRectMake(0, 0, searchController.view.frame.size.width, searchController.view.frame.size.height); 

} 

Тогда мнения выравнивать. Тем не менее, его janky, потому что он прыгает. Если я изменяю кадр в willPresentSearchController, он не работает, так как контроллер должен делать какой-то макет после его представления.

Если я использую SparkInspector и отредактировал фрейм UISearchBarContainerView от начала 64 (что он установлен на 0, то проблема решена.

Вот моя соответствующая конфигурация:

self.searchResultsController = [[GMSearchTableViewController alloc] init]; 
self.definesPresentationContext = YES; 
self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.searchResultsController]; 
self.searchController.dimsBackgroundDuringPresentation = YES; 
self.searchController.hidesNavigationBarDuringPresentation = NO; 
self.searchController.searchBar.frame = CGRectMake(0, 0, self.view.frame.size.width, 44); 
[self.view addSubview:self.searchController.searchBar]; 

Я не использую Interface Builder, все настроено в коде. Я уверен, что настройка definesPresentationContext верна.

VC находится в обычном UINavigationController, который находится внутри SplitViewController (но проблема существует и на iPhone).

Любые идеи? Я чувствую, что мне не хватает простой опции конфигурации в отношении UINavigationBar

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

Когда я установил

self.definesPresentationContext = NO; 

Это происходит: enter image description here

Так что теперь UISearchBar получает установлены правильно, но контекст презентации неправильно, в результате чего вид таблицы в UISearchController «сек, чтобы занять полное представление ,

+0

Благодарим вас за предоставление решения по вашему вопросу. Это помогло. самостоятельно.definePresentationContext = NO; – Coder

ответ

10

Ну в классической манере, я нашел решение (https://stackoverflow.com/a/30010473/579217)

Это делает трюк:

- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar 
{ 
    if (bar == self.searchController.searchBar) { 
    return UIBarPositionTopAttached; 
    } 
    else { // Handle other cases 
    return UIBarPositionAny; 
    } 
} 
0

Если Tableview является заказ UITableView и не UITableViewController вы должны скрыть верхнюю часть из tableview под панелью навигации, потому что строка поиска автоматически привязана к заголовку табличного представления, и если ваше представление таблицы начинается с панели навигации, я вызываю эту проблему. Просто сделайте стол просмотра полного экрана сверху панели навигации.

+0

Мое представление таблицы является обычным, однако я привязываю панель поиска вручную, используя contentInsets tableview вместо заголовка, потому что я хочу, чтобы он всегда был видимым. У меня был контроллер поиска, который раньше скрывал навигационную панель, но выглядел язвительным, и мне лично нравилось, что панель навигации все еще видна, поэтому пользователь может быстро получить доступ к другим действиям во время поиска. – JBlake

+0

Итак, если табличное представление является обычным, просто добавьте строку поиска, прежде чем tableview не будет внутри нее. затем добавьте представление таблицы в строке поиска и скройте заголовок таблицы в строке поиска. это будет так, как вы этого хотите. :) – rmammadli