Панель пользовательского поиска и элемент UINavigationItem

StackOverflow https://stackoverflow.com/questions/1614687

Вопрос

Кажется, я не могу заставить 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 для таких вещей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top