Как использовать 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 и, очевидно, выглядит очень странно.

Как мне это сделать?

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

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

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

Update:

Этот ответ предложил подклассифицировать UISearchController, чтобы изменить его высоту searchBar.