it-swarm.com.ru

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

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

55
Zoë Smith

Итак, я наконец-то нашел решение для себя. Хотя более чем вероятно, что у нас есть другие вещи в нашем коде/раскадровке (вот почему это сложный вопрос), по большей части я следовал руководству Apple по UISearchController: ( https://developer.Apple.com/ библиотека/ios/samplecode/TableSearch_UISearchController/Введение/Intro.html )

Почти весь мой код идентичен их коду, но я не мог заставить панель поиска не прыгать при нажатии внутри нее. Поэтому я проверил «под непрозрачными столбиками» как исходное представление таблицы, так и представление таблицы результатов поиска в моей раскадровке. Это заставило панель поиска перестать прыгать.

Но была одна последняя проблема, которая заключалась в том, что первая строка представления таблицы результатов была скрыта панелью поиска. Чтобы это исправить, я добавил self.tableView.contentInset = UIEdgeInsetsMake(kHeightOfTableViewCells, 0, 0, 0); в метод viewDidLoad представления таблицы результатов. Вуаля!

27
Brian Sachetta

Старый вопрос, но я смог решить эту проблему, установив 

self.extendedLayoutIncludesOpaqueBars = YES;

на мой взгляд контроллер. Я думаю, что проблема вызвана наличием непрозрачной панели навигации, но установкой hidesNavigationBarDuringPresentation в NO на вашем контроллере поиска, в результате чего панель поиска неправильно позиционирует себя, когда фокусируется.

63
ppilone

Мне удалось предотвратить смещение UISearchBar, удалив следующую строку из моего ViewController: self.definesPresentationContext = YES; 

28
Piotr Tomasik

definePresentationContext = 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
19
Gleb

Мой ход. У меня также была эта проблема, когда я следовал примеру кода 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 по обеспечению качества (применимо к iOS 8) 

15
Sozin's Comet

Я столкнулся с этой проблемой совсем недавно, и ни одно из решений не помогло мне. Возможно, из-за того, что мой пользовательский интерфейс более сложный (мое табличное представление с поддержкой поиска содержится в UITabController внутри UiNavigationController), в любом случае, ни один из вышеперечисленных рабочих .. Я мог бы просто решить свою проблему с помощью этого очень аккуратного фрагмента кода, который я нашел в: UISearchController не отображает панель навигации при повороте

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

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

14
M. Porooshani

Нашел это! Это, кажется, оскорбительная линия в viewDidLoad представляемого vc: 

self.edgesForExtendedLayout = UIRectEdgeNone;

Удалил это и панель поиска осталась на месте, как и предполагалось. 

6
Zoë Smith

снимите флажок Настройте вкладки просмотра прокрутки 

а также

проверка Под верхними полосами

Исправлена ​​ моя проблема  enter image description here

4
Basil Mariano

для iOS 11 и Swift 4, установите нижеприведенную строку в viewController, чтобы решить мою проблему (searchBar перейти вниз):

self.edgesForExtendedLayout = .bottom
2
side

Я полагаю, вы установили UISearchBar frame.original.y = 64

есть код

if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) {
    [self setEdgesForExtendedLayout:UIRectEdgeNone];
}

searchBar.frame = CGRectMake(0, 0, 376, 44);

мытье может помочь вам

1
Hawe

Как уже упоминалось в первом посте, всем нужно другое решение. Так вот мой. Мне пришлось объединить две вещи, упомянутые на этой странице, а именно:

Свифт 2:

    navigationController?.navigationBar.translucent = true

    edgesForExtendedLayout = .None
0
hashier

Если вы используете UINavigationController и TabBar, вы не можете использовать:

self.extendedLayoutIncludesOpaqueBars = true

Вам понадобится это решение: https://stackoverflow.com/a/46151063/3369381

0
demylia

В моем случае установка навигационной панели на self.navigationController.navigationBar.translucent = NO; устранила проблему. Кажется, что слой представления панели поиска не учитывает полупрозрачность панели навигации при размещении панели поиска.

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

0
Alex Medearis

это очень просто, просто добавьте clipsToBounds = true представления заголовка представления таблицы в строке поиска ведьмы.

countryTableView.tableHeaderView?.clipsToBounds = true
0
Prit_Singh