UISearchController: searchBar и scopeBar перекрываются при первом касании

Я пытаюсь внедрить простую панель поиска, используя последнюю версию UISearchController от Apple. Однако мне не удается заставить ее работать правильно, если я использую панель области поиска для выбора фильтра.

Полоса видимости всегда показывает, с чем я мог бы жить при запуске полоса видимости всегда показывает

но при событии самого первого касания панель поиска и область видимости перекрываются. Панель поиска и область видимости  коллапс

Я использовал пример кода приложения Apple TableView, но это ничего не изменило.

- (void)viewDidLoad {
[super viewDidLoad];

_resultsTableController = [[APLResultsTableController alloc] init];
_searchController = [[UISearchController alloc] initWithSearchResultsController:self.resultsTableController];
self.searchController.searchResultsUpdater = self;
[self.searchController.searchBar sizeToFit];
self.searchController.searchBar.showsScopeBar = YES;
[self.searchController.searchBar setScopeButtonTitles:@[@"First",@"Second"]];
self.tableView.tableHeaderView = self.searchController.searchBar;

// we want to be the delegate for our filtered table so didSelectRowAtIndexPath is called for both tables
self.resultsTableController.tableView.delegate = self;
self.searchController.delegate = self;
self.searchController.dimsBackgroundDuringPresentation = NO; // default is YES
self.searchController.searchBar.delegate = self; // so we can monitor text changes + others

// Search is now just presenting a view controller. As such, normal view controller
// presentation semantics apply. Namely that presentation will walk up the view controller
// hierarchy until it finds the root view controller or one that defines a presentation context.
//
self.definesPresentationContext = YES;  // know where you want UISearchController to be displayed

}

Я также реализовал методы делегирования панели поиска, но это просто переключает время перекрытия.

Кто-нибудь смог реализовать панель поиска с помощью UISearchController в iOS 8 и с помощью панели области видимости searchBar?

заранее спасибо


person maxlxb    schedule 15.07.2015    source источник
comment
Вы нашли решение для этого?   -  person koen    schedule 02.09.2015
comment
У меня такое же поведение при переключении с портрета на пейзаж и обратно. Если во время этого процесса поиск активен (то есть: seachBar является firstResponder), то я получаю тот же результат: scopeButtons видны за панелью поиска.... После UISearchDisplayController, UISearchController... так же глючит, как и его предшественник, молодец, Apple ^^   -  person polo987    schedule 06.06.2018


Ответы (3)


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

Решение состоит в том, чтобы убедиться, что для свойства showScopeBar в строке поиска, принадлежащей UISearchController, установлено значение false, то есть UISearchController.searchBar.showsScopeBar = false в Swift.

Проблема, похоже, заключается в том, что цель дизайна Apple заключается в том, чтобы свойство showsScopeBar использовалось с автономными панелями поиска, а не с панелями поиска, управляемыми UISearchController. К сожалению, это не упоминается в документации класса. Плохое дизайнерское решение, на мой взгляд, но это то, что есть.

Обсуждение ведется в следующей ветке https://devforums.apple.com/thread/235803 (неработающая ссылка по состоянию на 26 января 2018 г.).

Удачи.

person Rich16    schedule 04.07.2016

Похоже, это известный дефект. Есть несколько записей radr, таких как http://www.openradar.me/20702394, которые относятся к похожим проблемам. и обходной путь с помощью sizeToFit()

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

override func viewDidLayoutSubviews() {
    self.searchController.searchBar.sizeToFit()
}
person perNalin    schedule 12.09.2015
comment
К сожалению, это не сработало для меня. Однако в конце концов у меня сработало использование sizeToFit в -(void)didPresentSearchController:(UISearchController *)searchController{ [searchController.searchBar sizeToFit]; } - person maxlxb; 14.09.2015

Обновление для Swift 3:

searchController.searchBar.showsScopeBar = false

Обновление для Swift 4:

Кажется, в swift 4 и ios 11 панель поиска изменилась. С помощью метода, показанного выше, в некоторых случаях панель области видимости будет находиться внутри панели поиска.

if #available(iOS 11.0, *) {
        navigationItem.searchController = searchController
        navigationItem.hidesSearchBarWhenScrolling = false
    } else {
        tableView.tableHeaderView = searchController.searchBar
    }

Это исправило это для меня. Я использую форму, показанную выше, если доступна iOS 10. Если доступна iOS 11, я меняю свою технику и устанавливаю контроллер представления навигации на контроллер поиска. Вы заметите, что он выглядит точно так же, как на iOS 10.

person Nouri Alexander Hilscher    schedule 30.08.2017
comment
Атрибут showScopeBar относится только к пользовательским панелям поиска. Если вы укажете заголовки кнопок вашей области и установите для showsScopeBar значение false, все должно работать, потому что в противном случае вы создаете для scopeBars. Один автоматически создается вашим SearchBarController, а другой — путем установки для .showsScopeBar значения true. Если вы установите для него значение false, панель области видимости будет отображаться только тогда, когда вы действительно что-то ищете, и она не будет перекрываться с панелью поиска. - person Nouri Alexander Hilscher; 01.09.2017