Не удается использовать UISearchController с UICollectionView?

В разговоре WWDC 2014 "A Look Inside Presentation Controllers" ведущие продемонстрировали, как настроить UISearchController в UITableView. Они делают это, устанавливая кадр searchController searchBar, а затем устанавливая его как tableView tableHeaderView. К сожалению, нет эквивалента tableHeaderView для UICollectionView. С UISearchDisplayController это было бы просто: создать UISearchBar и добавить его в пользовательский заголовок раздела UICollectionView, а затем инициализировать UISearchDisplayController с помощью панели поиска. Проблема в том, что вы не можете инициализировать UISearchController с помощью UISearchBar или даже установить searchBar, потому что это свойство только для чтения. Думаю, мой настоящий вопрос: каковы мои варианты? Есть ли "хороший" способ реализовать поиск без UISearchDisplayController или UISearchController?

Ответ 1

С UISearchDisplayController это было бы просто: создать UISearchBar и добавить его в пользовательский заголовок раздела UICollectionView, а затем инициализировать UISearchDisplayController с помощью строки поиска

Панель поиска в UISearchController создана для вас. Когда вам будет предложено дополнительное представление в методе источника данных

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath

добавьте searchController.searchBar как подпункт дополнительного вида. Не забудьте позвонить

[searchController.searchBar sizeToFit]

чтобы дать строке поиска соответствующий размер.

Ответ 2

Мой первый вопрос: почему вы не можете перевернуть свою логику и вместо того, чтобы создавать панель поиска, сначала создайте UISearchController, возьмите свою панель поиска и добавьте ее в заголовок раздела?

Во-вторых, макеты коллекций не так просты, как представления таблиц. Трудно для поиска угадать ваши намерения с макетами просмотра коллекций, тогда как представление таблицы довольно просто. Таким образом, в случае просмотра коллекции вы можете добавить панель поиска в представление, но оживление ее в активное состояние потребует некоторой работы. (Subclass UISearchController и верните свой собственный контроллер анимации, затем сделайте любую анимацию, которую вы хотите) или просто реализуйте методы из UIViewControllerAnimatedTransitioning в своем подклассе и не вызывайте супер, оба должны работать)

Что-то, что вы, возможно, захотите попробовать, это отобразить строку поиска с экрана. Это встроенная анимация. UISearchController поддерживает, когда вызывается setActive: и строка поиска не находится нигде в иерархии представлений. Календарь делает это... это довольно круто. Вместо того, чтобы всегда присутствовать гигантская панель поиска, вы можете уменьшить поиск до значка, который выводит презентацию.

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