Как заменить панель навигации на UISearchBar? - PullRequest
0 голосов
/ 28 февраля 2020

Я бы хотел заменить панель навигации на показанную строку поиска и обратно.

ИЛИ

Было бы хорошо, если бы панель навигации всегда крутилась над содержимое моего основного контроллера вида.


I настроить контроллер поиска следующим образом:

_searchController = [[UISearchController alloc] initWithSearchResultsController:[[MySearchViewController alloc] init]];
_searchController.delegate = self;
_searchController.obscuresBackgroundDuringPresentation = TRUE;
_searchController.hidesNavigationBarDuringPresentation = TRUE;
_searchController.searchBar.placeholder = @"Search...";
_searchController.searchBar.delegate = self;

I show the контроллер поиска вот так:

- (void)searchButtonTapped:(id)sender
{
  self.navigationItem.searchController = _searchController;
  [self.navigationController.view setNeedsLayout];
  [self.navigationController.view layoutIfNeeded];
  [self.navigationItem.searchController.searchBar becomeFirstResponder];
}

I скрыть контроллер поиска вот так:

- (void)willDismissSearchController:(UISearchController*)searchController
{
  self.navigationItem.searchController = nil;
  [self.navigationController.view setNeedsLayout];
}

Я знаю, что есть свойство searchController.hidesNavigationBarDuringPresentation, которое близко к что хочу но точно. Поскольку панель навигации скрывается только после того, как я вхожу в панель поиска, но я хочу, чтобы она уже скрывалась, когда я представляю панель поиска.

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


Я уже пытался:

  • , чтобы скрыть панель навигации, когда я показываю контроллер поиска с [self.navigationController setNavigationBarHidden:YES animated:NO];
  • управлять ограничением высоты панели поиска и изменять его в соответствии с visibilty
  • , чтобы установить контроллер поиска на navigationItem.titleView -> это не то, что я хочу
  • скрыть контроллер поиска в соответствии с видимостью - > панель навигации остается на той же высоте, только контроллер поиска скрыт
  • , чтобы использовать self.definesPresentationContext, но это похоже на настройку, которая мне нужна
  • имел посмотрите на self.navigationItem.hidesSearchBarWhenScrolling, но это не относится, так как я не использую контроллер табличного представления

1 Ответ

0 голосов
/ 06 марта 2020

Я мог бы сделать свой первый вариант для

Я хотел бы заменить панель навигации на строку поиска, как только показано и обратно.

работа.

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

Я был бы Интересно, есть ли более простой способ добиться того же?

@interface MyViewController() <UISearchControllerDelegate, SearchDelegate>
@end

@implementation MyViewController
{
  UIView*                    _navigationItemTitleView;
  NSArray<UIBarButtonItem*>* _leftBarButtonItems;
  NSArray<UIBarButtonItem*>* _rightBarButtonItems;
}

- (void)viewDidLoad
{
  _searchController        = [[UISearchController alloc] initWithSearchResultsController:[[MySearchViewController alloc] init]];
  // ....
  _navigationItemTitleView = self.navigationItem.titleView;
  _leftBarButtonItems      = self.navigationItem.leftBarButtonItems;
  _rightBarButtonItems     = self.navigationItem.rightBarButtonItems;
}

- (void)searchButtonTapped:(id)sender
{
  // show the search bar in the navigation item
  self.navigationItem.leftBarButtonItems  = nil;
  self.navigationItem.rightBarButtonItems = nil;
  self.navigationItem.titleView = _searchController.searchBar;
  _searchController.active = TRUE;
}

- (void)willDismissSearchController:(UISearchController*)searchController
{
  // hide the search bar and restore previous state of the navigation item
  self.navigationItem.leftBarButtonItems  = _leftBarButtonItems;
  self.navigationItem.rightBarButtonItems = _rightBarButtonItems;
  self.navigationItem.titleView           = _navigationItemTitleView;
}
...