Подтвердить что ты не робот

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 не задействованы ни один из полей "расширить границы" (все, казалось, были возможными вещами, которые могли бы отбросить поисковое представление, от чтения),

Кто-нибудь знает, как я могу остановить панель поиска от анимации?

4b9b3361

Ответ 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/...