UISearchBar, представленный UISearchController в представлении заголовка таблицы, слишком затягивается, когда активен
Я использую UISearchController для представления строки поиска в виде заголовка таблицы:
...
self.searchController.hidesNavigationBarDuringPresentation = NO;
self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar;
[self.searchController.searchBar sizeToFit];
self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar;
(где задано свойство tableHeaderView дважды, поскольку в противном случае представление заголовка перекрывает первую строку, c.f. пару ответов на S.O.)
Вот как он выглядит, отлично в положении, когда он неактивен:
![Inactive search bar in correct position]()
Строка поиска должна просто оставаться на месте, когда активна - я не хочу, чтобы она двигалась вверх, чтобы скрыть панель навигации. Но он неожиданно оживляет вниз, оставляя пробел между ним и навигационной панелью:
![Screenshot showing search bar animated too far down]()
Здесь a
видео с необычной анимацией в строке поиска
Если я просто использую панель поиска отдельно от UISearchController, она не проявляет такого же поведения, когда она становится активной.
В моем представлении диспетчера представлений у меня есть self.definesPresentationContext = YES;
и self.navigationController.navigationBar.translucent = YES;
, а в IB не задействованы ни один из полей "расширить границы" (все, казалось, были возможными вещами, которые могли бы отбросить поисковое представление, от чтения),
Кто-нибудь знает, как я могу остановить панель поиска от анимации?
Ответы
Ответ 1
Хорошо, поэтому я, наконец, понял решение для себя. Хотя более вероятно, что у нас есть другие вещи в нашем коде/раскадровке (вот почему это трудный вопрос для ответа), по большей части я следил за учебником Apple по UISearchController: (https://developer.apple.com/library/ios/samplecode/TableSearch_UISearchController/Introduction/Intro.html)
Почти весь мой код идентичен их, но я не мог заставить панель поиска не прыгать при нажатии внутри нее. Так что я сделал проверку "под непрозрачными барами" как для исходного вида таблицы, так и для таблицы результатов поиска в моей раскадровке. Это привело к тому, что панель поиска перестала прыгать.
Но была одна последняя проблема, которая заключалась в том, что первая строка таблицы результатов была скрыта панель поиска. Чтобы исправить это, я добавил self.tableView.contentInset = UIEdgeInsetsMake(kHeightOfTableViewCells, 0, 0, 0);
в метод viewDidLoad
в представлении таблицы результатов. Вуаля!
Ответ 2
Старый вопрос, но я смог решить эту проблему, установив
self.extendedLayoutIncludesOpaqueBars = YES;
на моем контроллере просмотра. Я думаю, проблема связана с наличием непрозрачной навигационной панели, но с настройкой hidesNavigationBarDuringPresentation
на NO
на вашем поисковом контроллере, что приводит к тому, что панель поиска неправильно позиционирует себя при фокусировке.
Ответ 3
Мне удалось предотвратить переход UISearchBar
вниз, удалив следующую строку из моего ViewController:
self.definesPresentationContext = YES;
Ответ 4
определяетPresentationContext = true
override func viewDidLoad() {
super.viewDidLoad()
searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.hidesNavigationBarDuringPresentation = false
searchController.dimsBackgroundDuringPresentation = true
searchController.searchBar.searchBarStyle = UISearchBarStyle.Prominent
self.tableView.tableHeaderView = searchController.searchBar
definesPresentationContext = true
Ответ 5
Моя очередь. У меня также была эта проблема, когда я следил за образцом кода WWDC.
Я заметил, что если бы я не задал свойство scopeButtonTitles для searchBar, searchBar не был бы виден. При ближайшем рассмотрении у него просто была рамка CGRectZero. Это означает, что настройка scopeButtonTitles устанавливает кадр за кадром. Поэтому, если вы не хотите показывать какие-либо объекты scopeButtonTitles, но все же хотите, чтобы не было жесткого кода UISearchBar на определенную высоту, установите scopeButtonTitles в пустой массив.
self.searchController = UISearchController(searchResultsController: nil)
self.searchController.searchResultsUpdater = self
self.searchController.searchBar.scopeButtonTitles = []
self.tableView.tableHeaderView = self.searchController.searchBar
Установка scopeButtonTitles в массив из 1 строки не отображает названия кнопок области видимости, но по-прежнему имеет логику для рассмотрения вида, по существу, закручивая макет.
Поддержка компании Apple QA (применительно к iOS 8)
Ответ 6
Я столкнулся с этой проблемой совсем недавно, и ни один из решений не работал у меня. Возможно, потому что мой пользовательский интерфейс более сложный (мой табличный вид с поддержкой поиска содержится в UITabController внутри UiNavigationController), в любом случае, ни один из вышеперечисленных работников.
Я мог бы просто решить свою проблему с помощью этой очень аккуратной части кода, которую я нашел по адресу:
UISearchController не перерисовывает панель навигации повернуть
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar
{
if (bar == searchController.searchBar) {
return UIBarPositionTopAttached;
}
else { // Handle other cases
return UIBarPositionAny;
}
}
Еще одна вещь, которая добавляет: после того, как вся моя иерархия контроллеров расширялась под непрозрачными и верхними барами, моя панель поиска начала скрываться под навигационной панелью и появилась бы сразу после поворота может случиться. это послужило для меня сигналом о том, что есть какая-то ошибка, и некоторая информация, касающаяся моего макета, была неправильной. этот метод делегата помогает моему контроллеру понять ситуацию с поисковой панелью с кочевниками!
Ответ 7
Нашел! Кажется, это оскорбительная линия в viewDidLoad
представления vc:
self.edgesForExtendedLayout = UIRectEdgeNone;
Удалено, и строка поиска осталась на месте, как и было предсказано.
Ответ 8
снятие отметки Настроить вставки прокрутки
и
проверка Под верхними барами
Исправлена моя проблема ![введите описание изображения здесь]()
Ответ 9
Я предполагаю, что вы установили UISearchBar frame.original.y = 64
есть код
if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) {
[self setEdgesForExtendedLayout:UIRectEdgeNone];
}
searchBar.frame = CGRectMake(0, 0, 376, 44);
Мытье может помочь вам
Ответ 10
для iOS 11 и swift 4, установите строку ниже в viewController, разрешив мою проблему (сбой SearchBar):
self.edgesForExtendedLayout = .bottom
Ответ 11
В моем случае установка барной стойки на self.navigationController.navigationBar.translucent = NO;
устраняет проблему. Кажется, что уровень представления панели поиска не учитывает прозрачность навигационной панели при выкладке строки поиска.
Я понимаю, что это не идеальное решение, потому что прозрачность навигационной панели может отбросить макет в другом месте, но, по крайней мере, она устраняет проблему в случае, когда возможность непрозрачной навигационной панели является возможностью.
Ответ 12
Как упоминалось в первом посте, всем нужно было другое решение. Итак, вот моя. Мне пришлось совместить две вещи, упомянутые на этой странице, а именно:
Swift 2:
navigationController?.navigationBar.translucent = true
edgesForExtendedLayout = .None
Ответ 13
его очень просто, просто сделайте clipToBounds = true для заголовка представления таблицы в панели поиска ведьмы.
countryTableView.tableHeaderView?.clipsToBounds = true
Ответ 14
Если вы используете UINavigationController
и TabBar
, вы не можете использовать:
self.extendedLayoutIncludesOpaqueBars = true
Вам понадобится это решение: fooobar.com/info/108876/...