Как использовать UISearchController в iOS 8, где UISearchBar находится на панели навигации и имеет кнопки области действия?

Я пытаюсь использовать новый UISearchController из iOS 8 и встроить его UISearchBar в свой UINavigationBar. Это легко сделать следующим образом:

searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.delegate = self
searchController.searchBar.delegate = self
searchController.dimsBackgroundDuringPresentation = false
searchController.hidesNavigationBarDuringPresentation = false
navigationItem.titleView = searchController.searchBar

Но когда я добавляю кнопки области видимости:

searchController.searchBar.showsScopeBar = true
searchController.searchBar.scopeButtonTitles = ["Posts, Users, Subreddits"]

Он добавляет кнопки за UISearchBar и, очевидно, выглядит очень странно.

Как я должен это делать?


person Doug Smith    schedule 10.01.2015    source источник
comment
Можете ли вы предоставить снимок?   -  person Yaman    schedule 13.01.2015
comment
У меня такая же проблема. Кажется, что UISearchController не совсем понимает идею о том, что UISearchBar находится внутри панели навигации. Даже пример Apple, кажется, помещает searchBar ниже панели навигации.   -  person dineth    schedule 14.01.2015
comment
какую версию вы используете, эта проблема есть в бета-версии 3 и 4.   -  person simbesi.com    schedule 16.01.2015
comment
При необходимости перейдите по этой ссылке на источник, это должно помочь raywenderlich .com/16873/how-to-add-search-to-a-table-view   -  person simbesi.com    schedule 16.01.2015


Ответы (1)


Вы сталкиваетесь с «проблемой дизайна», когда ожидается, что scopeBar будет скрыт, когда searchController не активен.

Кнопки панели видимости появляются позади (под) панелью поиска, поскольку это их местоположение, когда панель поиска становится активной и анимируется в панели навигации.

Когда поиск неактивен, видимая полоса обзора будет занимать место на экране, отвлекать от содержимого и сбивать с толку пользователя (поскольку кнопки области действия не имеют результатов для фильтрации).

Поскольку ваш searchBar уже находится в titleView, анимация панели (навигации и поиска), которая показывает панель области, не происходит.

  • Самый простой вариант — расположить панель поиска под панелью навигации и позволить searchBar анимироваться в области заголовка при ее активации. Панель навигации изменит свою высоту, освободив место для скрытой панели области видимости. Все это будет обрабатываться контроллером поиска.
  • Второй вариант, почти такой же простой, — использовать значок кнопки панели поиска, который анимирует searchBar и scopeBar вниз, чтобы они отображались над панелью навигации.

    - (IBAction)searchButtonClicked:(UIBarButtonItem *)__unused sender {
        self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
        self.searchController.searchResultsUpdater = self;
        self.searchController.hidesNavigationBarDuringPresentation = NO;
        self.searchController.dimsBackgroundDuringPresentation = NO;
        self.definesPresentationContext = YES;
        self.searchController.searchBar.scopeButtonTitles = @[@"Posts", @"Users", @"Subreddits"];
        [self presentViewController:self.searchController animated:YES completion:nil];
    }
  • Если вы хотите, чтобы searchBar оставался в titleView, анимация для выполнения того, что вы хотите, не встроена. Вам придется свернуть свой собственный код, чтобы обработать изменение высоты navigationBar и отобразить собственную панель области видимости (или подключиться к внутренним компонентам). , и анимируйте встроенный scopeBar вниз и в поле зрения).

    Если вам повезло, кто-то еще написал willPresentSearchController: код для обработки нужного вам перехода.

  • Если вы хотите всегда видеть searchBar и scopeBar, вам, вероятно, придется отказаться от встроенного scopeBar и заменить его на UISegmentedControl, который пользователь будет видеть всегда, даже когда контроллер поиска не активен.

Обновление:

В этом ответе предлагается создать подкласс UISearchController, чтобы изменить высоту панели поиска.

person Community    schedule 17.01.2015
comment
Второй вариант просто фантастический (особенно часть presentViewController для searchController) - person Kedar Paranjape; 29.06.2015