UISearchBar представлены UISearchController в таблице вид заголовка оживляет слишком далеко, когда активный
Я использую UISearchController, чтобы представить строку поиска в представлении заголовка tableview:
...
self.searchController.hidesNavigationBarDuringPresentation = NO;
self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar;
[self.searchController.searchBar sizeToFit];
self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar;
(где установка свойства tableHeaderView дважды необходима, так как в противном случае представление заголовка перекрывает первую строку, т. е. пару ответов на S. O. )
вот как это выглядит, идеально в положении, когда он неактивен:

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

здесь
видео странной анимации панели поиска
Если я просто использую строку поиска отдельно от UISearchController, она не показывает такое же поведение, когда она становится активной.
в моем представлении контроллер вида, у меня есть self.definesPresentationContext = YES; и self.navigationController.navigationBar.translucent = YES;, и в IB ни один из ящиков "extend Edge" не активен (все, казалось бы, возможно вещи, которые могут отбросить презентацию поиска, от чтения вокруг).
кто-нибудь знает, как я могу остановить панель поиска от анимации вниз?
14 ответов:
хорошо, так что я, наконец, понял решение для себя. Хотя, скорее всего, у нас есть другие вещи в нашем коде / раскадровке (вот почему на этот вопрос трудно ответить), по большей части я следовал учебнику Apple по UISearchController: (https://developer.apple.com/library/ios/samplecode/TableSearch_UISearchController/Introduction/Intro.html)
почти весь мой код идентичен их, но я не мог заставить строку поиска не прыгать, когда щелчок внутри него. Поэтому я проверил "под непрозрачными полосами" как для исходного представления таблицы, так и для представления таблицы результатов поиска в моей раскадровке. Это заставило строку поиска перестать прыгать.
но была одна последняя проблема, которая заключалась в том, что первая строка представления таблицы результатов была скрыта панелью поиска. Чтобы исправить это, я добавил
self.tableView.contentInset = UIEdgeInsetsMake(kHeightOfTableViewCells, 0, 0, 0);доviewDidLoadметод моего представления таблицы результатов. Вуаля!
старый вопрос, но я смог решить эту проблему, установив
self.extendedLayoutIncludesOpaqueBars = YES;на моем контроллере вида. Я думаю, что проблема вызвана наличием непрозрачной панели навигации, но установка
hidesNavigationBarDuringPresentationtoNOна вашем контроллере поиска, в результате чего строка поиска неправильно позиционирует себя при фокусировке.
я смог предотвратить
UISearchBarот смещения вниз, удалив следующую строку из моего ViewController:self.definesPresentationContext = YES;
definesPresentationContext = 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
моя очередь. У меня также была эта проблема, когда я следовал примеру кода WWDC.
Я заметил, что если я не установил свойство scopeButtonTitles панели поиска, панель поиска не будет видна. При ближайшем рассмотрении у него просто была рамка CGRectZero. Это означает, что установка scopebuttontles устанавливает кадр за кулисами. Поэтому, если вы не хотите показывать какие-либо названия scopebuttontles, но все же не хотите жестко кодировать UISearchBar на определенную высоту, установите scopeButtonTitles к пустому массиву.
self.searchController = UISearchController(searchResultsController: nil) self.searchController.searchResultsUpdater = self self.searchController.searchBar.scopeButtonTitles = [] self.tableView.tableHeaderView = self.searchController.searchBarустановка scopeButtonTitles в массив из 1 строк не будет отображать заголовки кнопок области, но все еще имеет логику для работы с представлением, по существу завинчивая макет.
реквизит для команды QA Apple (применимо к iOS 8)
я столкнулся с этой проблемой совсем недавно, и ни одно из решений не сработало для меня. Возможно, потому, что мой пользовательский интерфейс более сложен (мое табличное представление с поддержкой поиска в содержимом UITabController внутри UiNavigationController) в любом случае, ни один из вышеперечисленных рабочих. Я мог бы просто решить свою проблему с помощью этого очень аккуратного фрагмента кода, который я нашел в: UISearchController не Redisplaying панель навигации на поворот
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar { if (bar == searchController.searchBar) { return UIBarPositionTopAttached; } else { // Handle other cases return UIBarPositionAny; } }еще одна вещь, чтобы добавить: после установки все мои иерархия контроллера, чтобы расшириться под непрозрачными и верхними полосами, моя панель поиска начала появляться скрытой под панелью навигации и появилась бы сразу после поворота. это было сигналом для меня, что есть какая-то ошибка выкладки, и некоторая информация о моем макете была неправильной. этот метод делегирования помогает моему контроллеру понять ситуацию в строке поиска в противном случае nomad!
нашли его! Это, кажется, наступательная линия в
viewDidLoadиз представленных ВК:self.edgesForExtendedLayout = UIRectEdgeNone;удалил это, и панель поиска осталась на месте, как и было предсказано.
для iOS 11 & swift 4, Установите строку ниже в viewController решена моя проблема (панель поиска прыгать вниз):
self.edgesForExtendedLayout = .bottom
Я думаю, вы установили UISearchBar
frame.original.y = 64есть код
if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) { [self setEdgesForExtendedLayout:UIRectEdgeNone]; } searchBar.frame = CGRectMake(0, 0, 376, 44);мойки может помочь вам
в моем случае, установив навигационную панель в
self.navigationController.navigationBar.translucent = NO;Исправлена проблема. Похоже, что уровень представления панели поиска не учитывает прозрачность навигационной панели при размещении панели поиска.Я понимаю, что это не идеальное решение, потому что прозрачность навигационной панели может сбросить макет в другом месте, но это, по крайней мере, устраняет проблему в случае, когда непрозрачная навигационная панель является возможностью.
Как уже упоминалось в первом посте все нужно другое решение. Так вот мой. Я должен был объединить две вещи, упомянутые на этой странице, а именно:
Swift 2:
navigationController?.navigationBar.translucent = true edgesForExtendedLayout = .None
его очень просто просто сделать clipsToBounds = true заголовка представления таблицы в строке поиска ведьмы добавляется.
countryTableView.tableHeaderView?.clipsToBounds = true
Если вы используете
UINavigationControllerиTabBarвы не могу использование:self.extendedLayoutIncludesOpaqueBars = trueвам понадобится это решение:https://stackoverflow.com/a/46151063/3369381

Comments