UISearchBar и UINavigationItem - PullRequest
       13

UISearchBar и UINavigationItem

2 голосов
/ 23 октября 2009

Я не могу заставить 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 есть панель поиска на панели навигации, и она идет до самых краев. Кто-нибудь знает, как сделать так, чтобы панель поиска доходила до краев, чтобы анимация моей кнопки отмены слайдов работала правильно?

Ответы [ 4 ]

5 голосов
/ 08 марта 2010

На самом деле, есть действительно простое решение. Все, что вам нужно сделать, это создать представление нулевой ширины для заднего элемента:

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 после того, как некоторая инициализация уже завершена.

2 голосов
/ 15 мая 2010

Следующий код скрывает панель навигации только для этого UIViewController:

- (void)viewWillAppear:(BOOL)animated
{
    [self.navigationController setNavigationBarHidden:YES animated:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [self.navigationController setNavigationBarHidden:NO animated:animated];
}

Таким образом, чтобы UISearchBar отображался вместо UINavigationBar, на вашем корневом контроллере представления просто есть панель поиска, где панель навигации будет нормально!

1 голос
/ 16 марта 2010

Я думаю, что нашел ответ - хотя я не проверял, чтобы проверить. В проблеме, которую я предоставил выше, у меня есть следующая структура:

контроллер панели вкладок -> контроллер навигации -> просмотр контроллера (ов)

Соответствующая панель поиска находилась в контроллере представления, который, в свою очередь, находился в контроллере навигации, а контроллер навигации находится в панели вкладок.

Я случайно наблюдал за курсами Stanford CS 193P (весна 2009 г.), и в конце лекции 13 ответ мог быть представлен. Алан Каннистраро заявил, что структура приложения Presence должна иметь такую ​​структуру:

эта структура http://img143.imageshack.us/img143/6/viewcontrollerstructure.jpg

где контроллер вида снизу (рядом с контроллером панели вкладок) был контроллером представления, который имел элемент управления панели поиска. Он предупредил, что если это не будет сделано таким образом, вы «столкнетесь с проблемами». Возможно проблема, с которой я столкнулся? Я верю в это.

0 голосов
/ 23 октября 2009

Возможно, Apple использует UISearchDisplayController для выполнения подобных задач.

...