Кнопки области видимости UISearchBar закрывают первый ряд результатов - PullRequest
1 голос
/ 29 июня 2011

Я работаю с UISearchBar впервые и не могу заставить его делать то, что я хочу.

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

Я хочу функциональность, которую Mail имеет, где кнопки области остаются в течение всего времени, пока есть текст в окне поиска, и вы можете увидеть изменение результатов поискапо мере того как вы меняете кнопку активной области.Но я не могу придумать, как это сделать, не закрыв первый ряд таблицы кнопками области.Вы не можете просто прокрутить вид таблицы вниз;строка поиска находится в заголовке табличного представления, так что все это прокручивается вместе.

Предложения приветствуются!

Обновлено после попытки предложения Эндрю ниже.

Одна вещь, о которой я забылзаключается в том, что в viewDidAppear я прокручиваю содержимое табличного представления вверх, чтобы поле поиска находилось вне верхней части экрана, но при необходимости его можно было прокрутить вниз.Это, очевидно, часть моей проблемы.Итак, в viewDidAppear у меня есть

if (theSearchBar.showsScopeBar != YES) {
    [self.tableView setContentOffset:CGPointMake(0, 44) animated:YES];
}

В searchBarShouldBeginEditing у меня теперь есть:

[self.navigationController setNavigationBarHidden:YES];
[self.tableView setContentOffset:CGPointMake(0, -44) animated:YES];
[UIView beginAnimations:@"searchBarUp" context:nil];
[UIView setAnimationDuration:1.0f];
searchBar.frame = CGRectOffset(searchBar.frame, 0, -44);
[UIView commitAnimations];

Это дает правильный результат, но когда появляются панели области видимости, существует разрыв междуверхняя часть представления и верхняя часть панели поиска, а первая строка закрыта.Затем полоса прокрутки (с кнопками контекста) сдвигается на место.Очевидно, это выглядит не очень хорошо.

Я ожидаю, что приведенный выше код будет:

  • скрыть панель навигации, в которой будет размещен верхний рядтаблица прямо под строкой состояния

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

  • переместить панель поиска вверх, чтобы между нижней частью панели поиска был промежуток в 44 пикселя, который должен быть заполнен кнопками области действия

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

Другая вещь, которую я нахожу очень странной, заключается в том, что если я использую приведенный фрагмент кода как есть, за исключением анимации: NO при вызове setContentOffset, я получаю другой результат.В этом случае первая строка таблицы не закрыта, но поле поиска находится над верхней частью представления и не может быть прокручено вниз (оно не останется).Видны только кнопки области.Для меня не имеет смысла, что простое отключение анимации изменило бы результат.

Теперь вы можете подумать, что при правильном размещении отображение результатов поиска будет работать просто так.Но нет.Несмотря на то, что навигационная панель теперь не отображается, над ней по-прежнему отображается большой пробел, и требуются те же корректировки содержимого таблицы и рамки панели поиска, что и выше.

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

Мне бы очень хотелось понять, что происходит, так кака также как это исправить, если кто-то может помочь пролить свет.

Обновлен снова для ясности - когда я говорю "исправить это", я имею в виду, чтобы он выглядел хорошо без видимых промежутков, когда части движутсяна место.Я даже не хочу, чтобы это было оживлено;скольжение в положение занимает слишком много времени.Но, как я упоминал выше, отключение анимации приводит к тому, что все снова оказывается не в том месте.

Обновлено в последний раз - я сделал так, чтобы он выглядел намного лучше, убрав блок анимации вокруг линии, чтобы переместить панель поиска. Я предполагаю, что перед началом анимации была введена пауза. Это достаточно хорошо сейчас, по крайней мере, на данный момент. Я все еще принимаю ответ Андрея, так как он направил меня в правильном направлении.

Ответы [ 4 ]

2 голосов
/ 29 июня 2011

В случае с Mail.app похоже, что они скрывают UINavigationBar с помощью чего-то вроде:

[self.navigationController setNavigationBarHidden:YES animated:YES];

Затем, используя анимацию UIView, они увеличивают размер панели поиска, чтобы занять место, котороебыл заполнен панелью навигации.

псевдокод:

[UIView beginAnimations:@"foo" context:NULL];
[UIView setAnimationDuration:1.0f];
CGRect newFrame = CGRectMake(0,0,self.view.frame.size.width, mySearchBar.frame.size.height);
mySearchBar.frame = newFrame;
//optionally, you could do something like this instead of setting a new frame
// mySearchBar.frame = CGRectOffset(mySearchBar.frame, 0, -44);
[UIView commitAnimations];

Все это будет идти в рамках метода UISearchBarDelegate

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar

Затем, когда пользователь отменяет поиск,

– searchBarCancelButtonClicked:

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

1 голос
/ 29 сентября 2013

У меня была такая же проблема. Так как я не использовал UISearchDisplayController (я хотел избежать использования таблицы поиска по умолчанию). Поэтому я предпочел перейти непосредственно к панели поиска. Проблема заключалась в том, что теперь панель поиска встроена в табличное представление (вы можете проверить это в раскадровке). Чтобы решить эту проблему, вам нужно встроить таблицу и панель поиска отдельно в UIView.

1 голос
/ 30 июня 2011

Вы используете UISearchDisplayController, верно?Если нет, вы должны.Он позаботится о многих работах, которые вы пытаетесь выполнить самостоятельно, например, о том, как скрыть панель навигации.

0 голосов
/ 16 ноября 2017

Это то, что я сделал, я использую SearchViewController:

if #available(iOS 11.0, *) {
    navigationItem.searchController = searchController
    }
    else{
        tableView.tableHeaderView = searchController.searchBar
    }
...