Панель пользовательского поиска и элемент UINavigationItem
-
06-07-2019 - |
Вопрос
Кажется, я не могу заставить UISearchBar позиционировать себя от крайнего левого края до крайнего правого на панели навигации.В методе -(void)viewDidLoad у меня есть следующий код:
UISearchBar *sb = [[UISearchBar alloc] initWithFrame:self.tableView.tableHeaderView.frame];
sb.delegate = self;
self.navigationItem.titleView = sb;
[sb sizeToFit];
[sb release];
Когда вы создаете и запускаете, на первый взгляд это выглядит просто отлично.Однако, присмотревшись повнимательнее, вы можете заметить, что слева есть поле / пробел.По большому счету, это не имело бы большого значения, но когда я нажимаю на строку поиска, чтобы начать поиск, я показываю анимированную кнопку отмены.Поскольку строка поиска расположена немного правее, анимация получается отрывистой, а кнопка отмены выпадает с конца вот так:текст ссылки
Кажется, что UINavigationItem похож на таблицу с тремя ячейками, где в первой и последней есть отступы, которые я не могу удалить - и, похоже, нет способа "объединить" все это вместе, а затем поместить туда строку поиска.Я знаю, что такой вид возможен, потому что в AppStore search есть строка поиска на панели навигации, и она простирается до самых краев.Кто-нибудь знает, как заставить панель поиска расшириться до краев, чтобы анимация кнопки отмены слайдов работала должным образом?
Решение 3
Я думаю, что нашел ответ, хотя я не проверял, чтобы убедиться.В вопросе, который я привел выше, у меня есть следующая структура:
контроллер панели вкладок -> навигационный контроллер -> контроллеры просмотра
Панель поиска, о которой идет речь, находилась в контроллере представления, который, в свою очередь, находился в контроллере навигации, который находится на панели вкладок.
Я случайно просматривал курсы Stanford CS 193P (весна 2009), и в конце лекции 13, возможно, был представлен ответ.Алан Каннистраро заявил, что структура приложения Presence должна иметь такую структуру:
эта структура http://img143.imageshack.us/img143/6/viewcontrollerstructure.jpg
где нижний контроллер вида (рядом с контроллером панели вкладок) был контроллером вида, который управлял панелью поиска.Он предупредил, что если это не будет сделано таким образом, вы "столкнетесь с проблемами".Возможно, проблема, с которой я столкнулся?Я верю в это.
Другие советы
На самом деле, есть действительно простое решение. Все, что вам нужно сделать, это создать представление нулевой ширины для заднего элемента:
UIView *hackView = [[UIView alloc] initWithFrame:CGRectZero];
UIBarButtonItem *hackItem = [[UIBarButtonItem alloc] initWithCustomView:hackView];
self.navigationItem.backBarButtonItem = hackItem;
[hackView release];
[hackItem release];
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero];
[searchBar sizeToFit];
self.navigationItem.titleView = searchBar;
[searchBar release];
Обязательно сделайте это в вашем методе loadView, а не в init. Я не уверен, почему это имеет значение, но это имеет значение.
Видимо, дело в сроках. Наличие его в loadView перестало работать для меня, но если поместить его в viewWillAppear, то это работает (с проверкой, чтобы это делалось только один раз, конечно). Я думаю, что идея состоит в том, чтобы установить titleView после того, как некоторая инициализация уже выполнена.
Следующий код скрывает панель навигации только для этого UIViewController:
- (void)viewWillAppear:(BOOL)animated
{
[self.navigationController setNavigationBarHidden:YES animated:animated];
}
- (void)viewWillDisappear:(BOOL)animated
{
[self.navigationController setNavigationBarHidden:NO animated:animated];
}
Таким образом, чтобы UISearchBar отображался вместо UINavigationBar, на вашем корневом контроллере представления просто есть панель поиска, где панель навигации будет нормально!
Может быть, Apple использует UISearchDisplayController для таких вещей.